¿El UIViewController llama al método presentViewController eliminado de la memory?

Supuestamente tengo un UIViewController A y un UIViewController B. Desde A, llamo al método presentViewController: B. Cuando aparece B, ¿qué le sucede a A? ¿Se elimina de la memory? Si no es así, ¿a qué método debo llamar para eliminarlo?

Si mi flujo de interfaz de usuario es así, A-> B-> A-> B-> A-> B-> … y así sucesivamente, ¿cómo evitar que la memory aumente en consecuencia?

Cuando utiliza el presentViewController:animated:completion: del controller A para presentar el controller B modal, lo que sucede es que la propiedad presentedViewController de A está configurada en el controller B y la propiedad de ViewController de B se establece en A Por lo tanto, ambos controlleres se mantienen en la memory mientras se lleva a cabo la presentación.

Cuando pasa de B a A , llama a dismissViewControllerAnimated:completion: en A través de la propiedad presentingViewController dismissViewControllerAnimated:completion: de B , así:

 [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 

(También puede llamar a [self dismissViewControllerAnimated:YES completion:nil] y el sistema reenviará automáticamente la request al controller de vista de presentación).

Después de eso, la propiedad presentedViewController de A se establecerá en nil y, en consecuencia, estará sujeta a la desasignación de memory por parte del sistema, siempre que no aparezca ningún otro puntero fuerte.

No, A no se eliminará de la memory. Y si desea alternar entre A y B, puede:

  • use un UINavigationController y presione B, luego UINavigationController nuevamente y vuelve a A
  • o haga B el nuevo controller raíz de su window y luego A nuevamente y agregue una transición adecuada
  • o usa a como la raíz y el presente B. Luego, descarta B y estás de vuelta en A.

El UIViewController permanecerá en la memory a less que lo haya hecho.

Use push & pop en lugar de simplemente empujar nuevos UIViewControllers .

En lugar de esto A->B->A->B->A->B->

Obtendrás esto A<->B

Tenga un controller de vista raíz siempre que A complete su tarea y permita que su vista raíz sea responsable de eliminar A y de presentar B. Como sabio cuando B termina su tarea, alerta a tu vista raíz para eliminar B y muestra A nuevamente.

No se lanzará automáticamente. Puede liberarla manualmente utilizando dismissModalViewControllerAnimated .

Aquí hay un muy buen tutorial para ver esto: Link