【发布时间】:2012-04-19 20:31:55
【问题描述】:
我通常使用如下示例的 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)。它遵循我朋友的建议。
我想知道我的朋友是否正确?在我看来,由于当前实例将被卸载或释放,超类的通知也是无用的。并且有没有系统 UIViewController 子类的使用通知?
【问题讨论】:
-
移除“超类”观察者是什么意思?观察者是一个对象实例而不是一个类。如果要释放它,它必须从所有通知中注销自己,即使它们已在超类的代码中注册。
-
@MrTJ 我的意思是在 super 的方法中添加的通知观察者。可能类实例的父亲在调用child的viewDidUnload方法时也需要观察一些通知。
-
可能是,可能是。如果您想在 viewDidUnload 中注销,那么为了安全起见,我建议使用第二种方法(每个观察者注销)
标签: iphone ios ipad nsnotification