iOS 6:从通知中心删除视图控制器

时间:2012-11-27 22:43:13

标签: objective-c notifications ios6 automatic-ref-counting dealloc

在iOS 6应用程序中,我有一些视图控制器作为观察者添加到默认通知中心。它们是在viewDidLoad方法中添加的,因为我希望控制器即使在不在顶层时也能收到通知。

很多人建议使用dealloc方法删除观察者。但是,在添加和删除观察者时,我一直在使用NSLog()记录消息,看起来dealloc永远不会被调用(我正在使用ARC)。

与人们的想法相反,viewDidUnload方法不是一种选择,因为在iOS 5中它仅在低内存条件下调用,而在iOS 6中它根本不被调用。

实际上似乎无法完成文档所需的操作!到目前为止,即使控制器被多次添加并且(显然)从未被删除,我的应用程序也没有崩溃。

注意:到目前为止,我一直在测试模拟器;有可能dealloc在实际设备中调用,而不是在模拟器中调用吗?或者是NSLog()的调用只是没有显示(尽管它显示在其他地方)。

2 个答案:

答案 0 :(得分:3)

即使在弧形中,也会调用dealloc。你不能在arc中调用[super dealloc],但是如果你的视图控制器被释放则应该调用dealloc。但是,如果您发现管理真的很困难,那么为什么不在viewWillAppear中添加通知观察器然后在viewWillDisappear中将其删除。这样,您将收到通知,直到显示视图,并且在未显示视图时,它可能会被释放,因此在viewWillDisappear中删除观察者并不会太麻烦。但是,肯定足够的dealloc被称为并且是一个很好的地方。

答案 1 :(得分:0)

@NSProxy是正确的,应该调用dealloc。但是,我的某些控制器没有被调用。原因如下:

视图控制器A正在转向控制器B.在prepareForSegue中,控制器A正在创建一个包含对控制器B(目标控制器)的引用的块。由于控制器A(主控制器永远不会离开)保持块,并且块保持在B,控制器B从未被解除分配。

我将块中对B的引用更改为弱指针,当B的视图消失时,调用了voilàdealloc。这个故事的寓意是,你需要非常小心你所属的一个属于一个班级的街区。

这仍然让我有一个谜:我仍然不知道为什么我的家庭控制器的dealloc永远不会被调用,即使通过单击主页按钮退出应用程序或在模拟器中停止它也是如此。没有块指的是家庭控制器,因此必须在控制器某处保留其他东西。