Iphone addobserver/removeobserver查询

Iphone addobserver/removeobserver查询,iphone,cocoa-touch,nsnotification,Iphone,Cocoa Touch,Nsnotification,可以先使用-removeObserver:,然后用相同的名称调用-addObserver:吗?或者在-removeObserver:之前先添加-addObserver:是一条规则吗 我用OS4.0试过了,看起来还可以(没有崩溃、警告等) 原因是为了防止使用相同的selectorName方法的两个观察者被调用两次,假设-setObserver方法在其内部-viewdiload并发出内存警告时被再次调用 另外,在-dealoc期间是否需要调用-removeObserver: 如果调用了两次-sele

可以先使用
-removeObserver:
,然后用相同的名称调用
-addObserver:
吗?或者在
-removeObserver:
之前先添加
-addObserver:
是一条规则吗

我用OS4.0试过了,看起来还可以(没有崩溃、警告等)

原因是为了防止使用相同的
selectorName
方法的两个观察者被调用两次,假设
-setObserver
方法在其内部
-viewdiload
并发出内存警告时被再次调用


另外,在
-dealoc
期间是否需要调用
-removeObserver:

如果调用了两次
-selectorName
,那么代码可能还有其他问题。即使Cocoa会优雅地删除您尚未添加的观察者,我也不会这么做


正如用户tonklon在评论中所说,您可能应该删除
-viewDidUnload
中的观察者。至于你的最后一个问题,在
-dealloc
中删除观察者也是合理的,尽管最好的做法是构造代码,使删除观察者这样的事情发生在确定的时间,而不是作为内存管理的副作用。

+1个好问题。我不知道删除以前未注册的观察者是否是保存,但我知道在解除分配之前必须删除该观察者。对于给定的情况,还可以在viewDidUnload中删除观察者。这就是此方法的用途:平衡在loadView和viewDidLoad中进行的所有调用。
-(void) setObserver
{
[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:OBSERVER_NAME object:nil]; 

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector: @selector(selectorName)
                                             name:OBSERVER_NAME 
                                           object:nil]; 
}