如何在没有子类化和覆盖dealloc的情况下确保removeObserver?

时间:2013-12-22 19:55:10

标签: ios memory-management nsnotificationcenter

使用NSNotificationCenter object时,如果您为通知添加了观察者,You must invoke removeObserver: or removeObserver:name:object: before any object specified by addObserverForName:object:queue:usingBlock: is deallocated

有没有办法在没有子类化对象并覆盖“dealloc”的情况下执行此操作?如果我可以避免它,我不想要将一堆对象子类化为仅使用它们的通知。在发生之前还有其他方法可以了解dealloc吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

一般来说,您应该考虑哪些对象正在观察变化并使其适当。这通常意味着一个控制器类,在这种情况下,您通常已经有一个自定义子类。通常应该接收观察回调并根据需要转发它们。它应该在创建/销毁/显示/从显示中删除时作为观察者添加和删除。

那就是说,如果你坚持制造任意类观察者,这是一个想法(我认为它应该是安全的,尽管我不想依赖它):

您可以使用单个自定义类来处理观察者的删除。这应该是一个配置了对要删除的类的引用的类。在配置方法期间,此类将自身添加到要使用objc_setassociatedobjectOBJC_ASSOCIATION_RETAIN删除的类,并将指针存储到要在NSValue中删除的类。然后,当它被取消分配时,它会使用NSValue从通知中心删除其他类。