在iOS 5 ARC中删除NSNotificationCenter观察器

Sko*_*ota 21 cocoa-touch objective-c nsnotifications nsnotificationcenter ios

我有一个基于iOS 5 ARC的项目,并且在我应该删除观察者的位置时遇到困难,NSNotificationCenter因为我已经注册了UIViewController.关于SO的类似帖子已经说过这应该在-dealloc方法中完成.尽管ARC项目中不需要此方法,但我已使用以下代码添加它:

- (void)dealloc {

    [[NSNotificationCenter defaultCenter] removeObserver:self];

}
Run Code Online (Sandbox Code Playgroud)

作为测试,我打开UIViewController(在a内UINavigationController),做一些触发通知的事情,然后通过点击Back按钮将其弹出堆栈.然后UIViewController,我重新打开,并做更多事情来触发通知,但请注意每个回调被调用两次 - 表明以前的通知尚未注销.重复此过程只会导致每次回调被调用多次,因此它们似乎永远不会取消注册.

任何帮助,将不胜感激!

Mic*_*ann 7

非常清楚你的dealloc方法没有被调用(也不是removeObserver调用).

为什么不在viewDidUnload:viewWillDisappear:方法中删除你的UIViewController的观察者?

  • `viewDidUnload:`只在内存不足的情况下被调用,据我所知.如果视图在屏幕外,我还需要通知回调仍然被触发,这意味着我不能使用`viewWillAppear:`和`viewWillDisappear:` (5认同)

Jes*_*sak 7

如果没有调用你的dealloc,可能是因为某人仍然持有对视图控制器的引用.也许你需要标记一些东西__weak?您可以使用分配工具来帮助跟踪视图控制器上的内容.