ARC下是否需要使用NSNotificationCenter的removeObserver方法?

43

添加观察者是否会增加对象的保留计数?如果是,ARC是否也处理删除此观察者?如果不是,我应该在哪里删除观察者?


请查看这个问题 - Adam
这和我几个月前问的一样 :) - Anoop Vaidya
2
我认为重新提出这些问题是有效的,因为我更喜欢寻找最新的问题答案,以防看法已经改变。 - amergin
我进行了测试并发现在dealloc中不调用removeObserver不会导致观察对象发布通知时崩溃。由于addObserver不保留观察者,因此仍然需要调用removeObserver吗? - Jing
1个回答

80

即使您使用 ARC,也应该显式地移除观察者。创建一个 dealloc 方法并在其中移除。

您应该明确地删除观察者,即使您使用 ARC。创建一个 dealloc 方法,在其中移除观察者。

-(void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

如果您看到这个方法,您不需要在这里调用[super dealloc];,只需要在没有super dealloc的方法中使用。

针对Swift的更新

如果您正在编写Swift代码,则可以在deinit方法中删除观察者。

deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
       }

一个问题:当你调用addObserver时,NSNotificationCenter是否会保留观察者?谢谢。 - Ricardo
3
通知中心不会对观察者保持强引用,因此在自动引用计数(ARC)中不需要显式地将它们移除。 - holex
deinit 方法中移除观察者是必要的。我曾经看到过与 NSNotificationCenter 相关的崩溃问题,通过移除观察者得以解决。 - Honghao Z
20
自iOS9开始,dealloc中注销观察者不再需要,此答案已经过时。参考链接:http://useyourloaf.com/blog/unregistering-nsnotificationcenter-observers-in-ios-9/。 - Bradley Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接