1

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

很多人建议在dealloc方法中删除观察者。但是,在添加和删除观察者时,我一直在记录消息NSLog(),并且看起来dealloc从未调用过(我正在使用 ARC)。

与人们的想法相反,该viewDidUnload方法不是一个选项,因为在 iOS 5 中它只在内存不足的情况下被调用,而在 iOS 6 中它根本不被调用。

实际上似乎没有办法做文档要求的事情!顺便说一句,到目前为止,我的应用程序还没有崩溃,即使控制器被多次添加并且(显然)从未被删除。

注意:到目前为止,我只使用模拟器进行测试;是否有可能dealloc在实际设备中被调用,但在模拟器中却没有?或者只是没有出现的呼吁NSLog()(尽管它出现在其他任何地方)。

4

2 回答 2

3

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

于 2012-11-27T22:49:49.773 回答
0

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

视图控制器 A 正在连接到控制器 B。在prepareForSegue中,控制器 A 正在创建一个包含对控制器 B(目标控制器)的引用的块。由于块由控制器 A 持有(它是家庭控制器从未离开过),并且块一直持有 B,控制器 B 从未被释放。

我将块中对 B 的引用更改为弱指针,并且当 B 的视图消失时调用了voilà 。dealloc这个故事的寓意是,你需要非常小心你在属于一个存在的类的块中引用的内容。

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

于 2012-11-28T22:34:41.547 回答