繁体   English   中英

哪个是删除 Notification observer 的更好方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM