ios objective-c uiviewcontroller automatic-ref-counting dealloc

ios - No se llama al método UIViewController-dealloc



objective-c automatic-ref-counting (4)

El método dealloc no se llama cuando la clase se retiene (o se retiene algo en esta clase) y no se vuelve a publicar. Es justo para proyectos con ARC y sin él. Así que revisa tu código dos veces.

Estoy trabajando con conteo automático de referencias. Tengo una subclase UIViewController personalizada y cada vez que llamo -presentViewController: animated:completion: o elimino su vista de la supervista, me gustaría NSLog algo así como "estoy desasignado", así que sé que el controlador de vista se ha eliminado con éxito. Implementé el método -dealloc en mi controlador de vista. Sin embargo, comencé un proyecto de prueba en el que solo tenía dos instancias de UIViewController (sin ciclos de retención) y no se llama UIViewController cuando UIViewController el segundo UIViewController modal o cuando elimino la supervista o cuando la elimino del controlador de vista principal. Me estoy perdiendo de algo ? En mi proyecto original (no en el caso de prueba) Instruments me muestra que esos controladores dejan una huella de memoria que no puedo deshacerme.


Para obtener una impresión cuando se desasigna el controlador de vista, puede implementar el método dealloc como

- (void) dealloc { NSLog(@"The instance of MyViewController was deallocated"); }

Luego, para obtener una impresión cuando View View Controller dejó la vista, puede implementar

- (void) viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; NSLog(@"The instance of MyViewController left the main view") }


Si desea cambiar los controladores de vista y desasignar el que está abandonando, simplemente cambie el controlador de vista raíz de la ventana. Entonces, si está en VC1 y quiere ir a VC2, entonces haga esto en VC1:

VC2 *vc2 = [[VC2 alloc] init]; // or however else is appropriate to get an instance of this class self.view.window.rootViewController = vc2;

Si no ha creado ninguna propiedad para apuntar a vc1, se desasignará después de realizar este cambio.

Si desea utilizar una presentación modal o una transición modal (para obtener la animación cuando cambia los controladores), aún puede obtener el controlador inicial para ser desasignado al cambiar el controlador de vista raíz después de la presentación desde el método viewDidAppear de vc2:

-(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; self.view.window.rootViewController = self; }


Si usa -presentViewController:animated:completion: está reteniendo parentViewController cada vez que llama a este método. ModalViewControllers simplemente se colocan encima del otro ViewController.

Los ModalViewControllers solo están diseñados para algún tipo de información / Entrada de usuario y cosas por el estilo. Si desea tramitar el ParentViewController, debe ocuparse de su propia implementación.