我将我的应用程序转换为ARC,并注意到在我的一个视图控制器中分配的对象在该视图控制器被解除分配时没有被解除分配.花了一段时间才弄清楚原因.我在调试时为我的项目启用了Zombie Objects,结果证明这是原因.考虑以下应用程序逻辑:
1)用户调用动作RootViewController,导致a SecondaryViewController通过创建和呈现presentModalViewController:animated.
2)SecondaryViewController包含ActionsController一个NSObject子类.
3)ActionsController通过NSNotificationCenter初始化时观察通知,并在取消分配时停止观察.
4)用户解雇SecondaryViewController返回RootViewController.
关闭"启用僵尸对象",上面的工作正常,所有对象都被取消分配.启用Zombie Objects on ActionsController即使SecondaryViewController已取消分配,也不会取消分配.
这导致我的应用程序中的问题b/c NSNotificationCenter继续向其发送通知,ActionsController并且生成的处理程序导致应用程序崩溃.
我创建了一个简单的应用程序,在https://github.com/xjones/XJARCTestApp上说明了这一点.查看控制台日志,启用/启用"启用僵尸对象"以验证这一点.
问题(S)
编辑#1:根据凯文的建议,我已经将其提交给Apple和openradar,网址为http://openradar.appspot.com/10537635.
编辑#2:澄清一个好的答案
首先,我是一位经验丰富的iOS开发人员,我完全理解ARC,僵尸对象等.如果我遗漏了某些东西,当然,我很欣赏任何照明.
其次,这种特定崩溃的解决方法是actionsController在secondaryViewController解除分配时作为观察者删除.我还发现如果我明确设置actionsController = nil什么时候secondaryViewControllerdealloc'ed它将被dealloc'ed.这两个都不是很好的解决方法b/c它们实际上要求你使用ARC但是代码好像你没有使用ARC(例如在dealloc中明确地使用nil iVars).特定的解决方案也无法确定何时这会成为其他控制器中的问题,因此开发人员确定地知道何时/如何解决此问题.
一个好的答案将解释如何确定性地知道你需要在使用ARC + NSZombieEnabled时对某个对象做一些特殊的事情,这样它就可以解决这个具体的例子并且通常也适用于整个项目而不会留下其他类似的潜力问题.
完全有可能没有好的答案,因为这可能是XCode中的一个错误.
谢谢大家!
我有一个MKMapView.有时在我的视图控制器被解雇后,我会得到一个EXC_BAD_ACCESS.
我打开了NSSZombies,它看起来像是MKMapView代表 - 我的视图控制器!- 正在被调用,尽管释放了子类MKMapView和UIViewController子类.我已经检查了,我的记忆管理是正确的.
这是怎么回事?