
In Cocoa do I need to remove an Object from receiving KVO notifications when deallocating it?
当我注册了一个对象foo以便从另一个对象栏接收KVO通知时(使用addObserver:...),如果我随后取消分配foo,我是否需要向-dealloc中的bar发送一条
您需要在运行 比这更好的是,有一个确定性的点,即拥有正在进行观察的对象的任何人都可以告诉它已经完成,并且将(最终)被释放。这样,您就可以在不再需要进行观察的事物时立即停止观察,而不管它何时真正释放。
要记住这一点很重要,因为可可中物体的寿命并不像某些人认为的那样具有确定性。各种Mac OS X框架本身都会向您发送对象
此外,当您过渡到Objective-C垃圾收集时,您会发现
坚持 我从痛苦的经验中获得了一些额外的信息:尽管在垃圾回收下运行NSNotificationCenter时,使用弱引用归零,但KVO却没有。因此,可以避免在使用GC时不删除NSNotificationCenter观察器(使用保留/释放时,您仍然需要删除观察器),但是您仍然必须按照Chris的描述删除KVO观察器。 绝对同意Chris关于"在-dealloc和-finalize ...中保留内存(和其他稀缺资源)的管理"的评论。很多时候,我会看到人们尝试在其dealloc函数中使NSTimer对象无效。问题是,NSTimer保留了它的目标。因此,如果该NSTimer的目标是self,则dealloc将永远不会被调用,从而导致潜在的讨厌的内存泄漏。
在 |