繁体   English   中英

UIViewController -dealloc方法未调用

[英]UIViewController -dealloc method not called

我正在使用自动参考计数。 我有一个自定义UIViewController子类,每当我调用-presentViewController: animated:completion:或从-presentViewController: animated:completion:删除它的视图我想NSLog东西,比如“我被解除分配”,所以我知道视图控制器已成功删除。 我在视图控制器中实现了-dealloc方法。 但是我开始了一个测试项目,其中我只有两个UIViewController实例(没有保留周期),并且当我按模式推送第二个UIViewController或者当我删除超级视图或从父视图控制器中删除它时,也没有调用-dealloc 我错过了什么吗? 在我原来的项目中(不是测试用例),仪器向我展示了那些控制器留下了我无法摆脱的内存占用。

如果要切换视图控制器,并将要切换的视图控制器解除分配,则只需切换窗口的根视图控制器即可。 所以,如果你在VC1中并且想要转到VC2,那么在VC1中执行此操作:

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

如果您尚未创建任何属性以指向vc1,则在进行此切换后将取消分配。

如果要使用模态表示或模态segue(在切换控制器时获取动画),仍然可以通过在vc2的viewDidAppear方法的演示之后切换根视图控制器来取消分配初始控制器:

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

要在取消分配View Controller时获取打印,您可以将dealloc方法实现为

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

然后,当View Controller离开视图时,您可以实现打印

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

如果使用-presentViewController:animated:completion:每次调用此方法时都会保留parentViewController。 ModalViewControllers简单地推到另一个ViewController之上。

ModalViewControllers仅适用于某种信息/用户输入和类似的东西。 如果要取消分配ParentViewController,则必须处理自己的实现。

当保留类(或保留此类中的某些内容)并且未重新发布时,不会调用dealloc方法。 它适用于同时具有ARC和没有它的项目。 所以检查你的代码两次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM