Tag: nszombieenabled

为什么在使用ARC + NSZombieEnabled时不会释放对象

我将我的应用程序转换为ARC,并注意到在视图控制器被释放时,在我的一个视图控制器中分配的一个对象没有被解除分配。 花了一段时间才弄明白为什么。 我在debugging过程中为我的项目启用了“僵尸对象”,事实certificate这是事实。 考虑下面的应用程序逻辑: 1)用户调用RootViewController中的动作,使SecondaryViewController被创build并通过presentModalViewController:animated呈现presentModalViewController:animated 。 2) SecondaryViewController包含一个ActionsController ,它是一个NSObject子类。 3) ActionsController在初始化时通过NSNotificationCenter观察一个通知,当它被解除分配时停止观察。 4)用户closuresSecondaryViewController返回到RootViewController 。 启用僵尸对象closures,上述工作正常,所有的对象被释放。 使用ActionsController上的启用僵尸对象不会解除分配,即使SecondaryViewController被释放。 这导致我的应用程序b / c中的问题NSNotificationCenter继续发送通知给ActionsController和结果处理程序导致应用程序崩溃。 我创build了一个简单的应用程序来说明这个在https://github.com/xjones/XJARCTestApp 。 查看与启用僵尸对象控制台日志开/关来validation这一点。 问题(S) 这是启用僵尸对象的正确行为? 我应该如何实现这种types的逻辑来消除这个问题。 我想继续使用启用僵尸对象。 编辑#1:根据凯文的build议,我已经提交给苹果和openradar在http://openradar.appspot.com/10537635 。 编辑#2:澄清一个很好的答案 首先,我是一名经验丰富的iOS开发人员,我完全了解ARC,僵尸对象等。如果我错过了某些东西,当然,我很欣赏任何照明。 其次,对于此特定崩溃的解决方法是,当secondaryViewController被释放时,将observer作为观察者移除。 我也发现,如果我明确地设置actionsController actionsController = nil当secondaryViewController dealloc'ed它将被dealloc'ed。 这两个都不是很好的解决方法B / C他们实际上要求您使用ARC,但代码,如果您不使用ARC(例如显式dealloc中的零iVars)。 一个特定的解决scheme也无助于确定何时这将成为其他控制器中的问题,因此开发人员可以确定何时/如何解决此问题。 一个好的答案可以解释如何确定性地知道在使用ARC + NSZombieEnabled时需要对某个对象做些特殊的事情,这样就可以解决这个具体的例子,并且也可以将整个项目作为一个整体应用,而不用再为其他类似项目问题。 完全有可能没有好的答案,因为这可能是XCode中的一个错误。 感谢所有!