Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa touch 为什么我需要在对象I';m:是不是取消分配了?_Cocoa Touch_Nsnotificationcenter - Fatal编程技术网

Cocoa touch 为什么我需要在对象I';m:是不是取消分配了?

Cocoa touch 为什么我需要在对象I';m:是不是取消分配了?,cocoa-touch,nsnotificationcenter,Cocoa Touch,Nsnotificationcenter,发件人: 必须在指定的任何对象之前调用removeObserver:或removeObserver:名称:object: addObserverForName:对象:队列:usingBlock:已解除分配 为什么在解除分配正在观察其通知的对象之前停止观察很重要?我理解为什么作为观察者,我需要停止观察,如果我要消失,而障碍取决于我的存在,但我不理解为什么被观察物体的寿命很重要。我是否误解了这一点?如果您不删除observer,它可能会导致您已经销毁了一个对象,但仍然发送了通知-这将导致“messa

发件人:

必须在指定的任何对象之前调用removeObserver:或removeObserver:名称:object: addObserverForName:对象:队列:usingBlock:已解除分配


为什么在解除分配正在观察其通知的对象之前停止观察很重要?我理解为什么作为观察者,我需要停止观察,如果我要消失,而障碍取决于我的存在,但我不理解为什么被观察物体的寿命很重要。我是否误解了这一点?

如果您不删除observer,它可能会导致您已经销毁了一个对象,但仍然发送了通知-这将导致“message sent to deallocated instance”错误

我理解为什么作为观察者,我需要停止观察,如果我要消失,而障碍取决于我的存在,但我不理解为什么被观察物体的寿命很重要

我认为可能的解释如下

addObserverForName:object:queue:usingBlock
description说明:

向接收方的分派表添加一个条目,其中包含通知队列和要添加到队列的块,以及可选条件:通知名称和发件人

在此上下文中,“发送者”只是
对象
参数的另一个名称,以下术语对其进行了描述:

要将其通知添加到操作队列的块的对象。 如果传递nil,则通知中心不会使用通知的发送者来决定是否将块添加到操作队列

因此,
object
充当一种过滤器:当收到通知时,通知中心根据该值(如果存在)决定是否必须将块添加到指定的操作队列中

现在,考虑一下:

  • 在不移除观察者的情况下解除被观察对象的分配

  • 创建了一个不同的对象,也可以发布通知,它恰好与在第1点解除分配的对象具有相同的地址

  • 现在,观察者将对第二个对象发布的通知作出反应


  • 我承认这是一个非常罕见的案例,但它可能会发生,所以你最好编写代码来反对它。

    对,但如果我作为观察者消失的话。文档似乎建议我需要在正在观察的对象消失之前删除自己,因为它说“addObserverForName指定的任何对象:对象:队列:usingBlock:is deallocated”不,您不需要在正在观察的对象消失之前删除自己。这毫无意义。文档只影响被标记为观察者的对象。那么,它在谈论什么对象呢?此方法注册一个块以观察通知,而不是对象+选择器。块已经保留了它所持有的任何内容。