【问题标题】:Is NSNotificationCenter removeObserver in ARC needed? [duplicate]是否需要 ARC 中的 NSNotificationCenter removeObserver? [复制]
【发布时间】:2013-03-17 09:18:00
【问题描述】:

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

【问题讨论】:

  • 这和几个月前我问的一样:)
  • 我认为重新提出这些问题是有效的,因为我更愿意寻找问题的最新答案,以防感知到的智慧发生了变化。
  • 我测试发现在dealloc中不调用removeObserver不会导致观察到的对象发布通知时崩溃。既然 addObserver 不保留观察者,那还需要 removeObserver 吗?

标签: iphone ios objective-c cocoa-touch automatic-ref-counting


【解决方案1】:

即使您使用ARC,您也应该明确删除观察者。创建一个dealloc 方法并在那里删除..

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

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

Swift 更新

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

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

【讨论】:

  • 一个问题:调用addObserver时,NSNotificationCenter是否保留观察者?谢谢。
  • 通知中心不会保存观察者的强引用,因此没有必要在ARC中明确删除它们。
  • 确实需要在deinit 方法中移除观察者。我已经看到与 NSNotificationCenter 相关的崩溃,并通过删除观察者来解决
  • 这个答案自iOS9以来已经过时,不再需要在dealloc中取消注册,参考:useyourloaf.com/blog/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多