【问题标题】:How do I invalidate a specific objective-c observer如何使特定的objective-c观察者无效
【发布时间】:2017-04-19 18:56:07
【问题描述】:

如何在 Objective-c 中删除特定的观察者?我有几个使用默认中心的观察者。当视图消失时,我正在调用:

[[NSNotificationCenter defaultCenter] removeObserver:self];

这似乎并没有删除观察者,而且他们被复制了。想知道如何保留观察者的参考以进行错误检查以查看它是否存在。这就是我创建观察者的方式。

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(updateChart)
                                             name:@"UPDATECHART"
                                           object:nil];

【问题讨论】:

  • 你什么时候打电话给addObserver?在这两个语句执行时记录消息以确保它们正确配对可能是个好主意。

标签: objective-c


【解决方案1】:

不要删除self,试试下面的代码:

[[NSNotificationCenter defaultCenter] removeObserver:self
                                                name:@"UPDATECHART" 
                                              object:nil];

【讨论】:

  • 我正在度假,所以我刚刚回到这个问题。这似乎解决了我遇到的问题。谢谢!
【解决方案2】:

如果你得到重复的观察者,这只是证明在调用addObserver:self,而已经有一个观察者。你需要弄清楚为什么会这样。我敢打赌这是因为self 正在泄露——当你认为它存在时,它并没有消失。因此,您有多个 self 代表的类的多个实例,它们持续浮动,所有都保持注册状态并得到通知。

您可以通过在updateChart 中记录self 来轻松证明或反驳该假设,因为记录提供了唯一标识符(内存地址)。如果您看到至少两个不同的唯一标识符,则说明该类的多个副本同时存在。

(还要注意,在现代 Foundation 代码中,不需要调用removeObserver;观察者是 ARC-weak 引用,并且可以在没有不良影响的情况下消失。在这种情况下, removeObserver 被调用的问题是红鲱鱼。]

【讨论】:

    【解决方案3】:

    您应该仔细检查 removeObserver 消息是否真的被发送。 Apple 的文档明确指出

    从接收者的调度表中删除所有指定给定观察者的条目。

    你确定self 是同一个对象吗?检查这是否是同一个指针可能有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多