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