如何删除objective-c中的特定观察者?我有几个使用defaultCenter的观察者。当视图消失时,我正在打电话:
[[NSNotificationCenter defaultCenter] removeObserver:self];
这似乎并没有删除观察者,他们正在重复。想知道如何保持观察者的引用以进行错误检查以查看它是否存在。这就是我创建观察者的方式。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(updateChart)
name:@"UPDATECHART"
object:nil];
答案 0 :(得分:1)
您应该仔细检查是否确实发送了removeObserver消息。 Apple的文档明确指出
从接收者的调度表中删除指定给定观察者的所有条目。
您确定self
是同一个对象吗?可能有意义检查这是同一个指针。
答案 1 :(得分:1)
如果您获得重复的观察者,这只会证明您在已经观察者时正在调用 for ( i = 1; i <= n ; i ++)
for ( j= i+1; j <= n; j++)
//print something
。你需要找出原因。我认为这是因为addObserver:self
泄漏 - 当你认为它不存在时它就不会存在。因此,您有多个类self
所代表的实例,持续浮动,全部保持注册状态,并且都会得到通知。
您可以通过在self
中记录self
来轻松证明或反驳该假设,因为日志记录提供了唯一标识符(内存地址)。如果您看到至少两个不同的唯一标识符,则您可以同时保留此类的多个副本。
(另请注意,在现代的基础代码中,不需要来调用updateChart
;观察者是ARC弱引用的,并且可以在没有不良影响的情况下不存在。 ,removeObserver
被召唤的问题是一个红色的鲱鱼。]
答案 2 :(得分:1)
请尝试以下代码,而不是删除self
:
[[NSNotificationCenter defaultCenter] removeObserver:self
name:@"UPDATECHART"
object:nil];