UIViewController -dealloc方法未调用

时间:2013-05-04 09:39:39

标签: ios objective-c uiviewcontroller automatic-ref-counting dealloc

我正在使用自动参考计数。 我有一个自定义的UIViewController子类,每当我调用-presentViewController: animated:completion:或从superview中删除它的视图时,我想NSLog类似于"我被释放了#34;所以我知道视图控制器已成功删除。我在视图控制器中实现了-dealloc方法。但是我开始了一个测试项目,我刚刚有两个UIViewController个实例(没有保留周期),当我以模态方式推送第二个-dealloc或删除超级视图时,我都没有调用UIViewController当我从父视图控制器中删除它时。我错过了什么吗?在我原来的项目中(不是测试用例),仪器向我展示了那些控制器留下的内存空间我无法摆脱。

4 个答案:

答案 0 :(得分:11)

如果要切换视图控制器,并将要切换的视图控制器取消分配,则只需切换窗口的根视图控制器即可。所以,如果您在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(在切换控制器时获取动画),你仍然可以通过在viewDidAppear方法的演示之后切换根视图控制器来取消分配初始控制器。 VC2:

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

答案 1 :(得分:0)

要在取消分配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")
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

保留类(或保留此类中的某些内容)并且未重新发布时,不会调用

dealloc方法。它适用于同时具有ARC和没有它的项目。所以检查你的代码两次。