![](/img/trans.png)
[英]Remove observer or find a better alternative to NotificationCenter ios
[英]Which is a better way to remove Notification observer
我通常像下面的示例一样使用 NSNotification:
在 viewDidLoad 中:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(foo:) name:kName1 object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(bar:) name:kName2 object:nil];
在 viewDidUnload 和 dealloc 中:
[[NSNotificationCenter defaultCenter] removeObserver:self];
但是一个朋友告诉我,我不应该使用[[NSNotificationCenter defaultCenter] removeObserver:self];
因为它将删除所有观察者,包括超类的观察者。 他建议我使用下面的代码来一个一个地移除观察者。
[[NSNotificationCenter defaultCenter] removeObserver:self name:kName1 object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:kName2 object:nil];
我检查了 ASIHttpRequest 库的代码( https://github.com/pokeb/asi-http-request )。 它遵循我朋友的建议。
我想知道我朋友说的对不对? 在我看来,既然当前实例会被unload或dealloc,超类的通知也是无用的。 还有系统UIViewController子类使用通知吗?
你的朋友是 100% 正确的。 但是,删除 dealloc 中的所有通知观察并不重要。
你提到了viewDidUnload
,那里的情况完全不同,因为卸载的 object 将保持活着,你不知道什么时候再次添加超类的通知观察。 如果将它们添加到 viewDidLoad 中,则不会有问题。 如果将它们添加到 init 方法中,您就会丢失一堆重要的通知观察结果。
删除具有特定名称的观察是一种很好的做法,应该从一开始就完成。
当你想删除你使用的所有通知时,
[[NSNotificationCenter defaultCenter] removeObserver:self];
如果你想删除你使用的特定通知,
[[NSNotificationCenter defaultCenter] removeObserver:self name:kName1 object:nil];
当您不再需要任何通知时,第一种方法很简单。
由于 object 即将消失,因此可以安全地使用[[NSNotificationCenter defaultCenter] removeObserver:self];
在dealloc
方法中。
在ViewDidUnload
方法中,你最好一个一个地删除每个观察者,因为对 controller 的引用仍然存在(你相应的viewDidLoad
应该将它们全部添加回来)。
我用的是第一种方式,从来没想过对不对。 如果调用 dealloc,那么 object(也包括 super)无论如何都会被释放。 您绝对不希望将 NSNotification 发送到已释放的实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.