Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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
Objective c 当使用KVO时,是否有必要删除self作为self in-dealoc的观察者?_Objective C_Key Value Observing - Fatal编程技术网

Objective c 当使用KVO时,是否有必要删除self作为self in-dealoc的观察者?

Objective c 当使用KVO时,是否有必要删除self作为self in-dealoc的观察者?,objective-c,key-value-observing,Objective C,Key Value Observing,在我的NSObject子类的-init方法中,实例将自己添加为它自己的一些关键路径的观察者,以便在任何时候更改其中一个属性时触发应该发生的操作。例如 [self addObserver:self forKeyPath:@"aProperty" options:0 context:nil]; [self addObserver:self forKeyPath:@"anotherProperty" options:0 context:nil]; ... 我的问题是,在类的-dealoc方法中,我是

在我的NSObject子类的-init方法中,实例将自己添加为它自己的一些关键路径的观察者,以便在任何时候更改其中一个属性时触发应该发生的操作。例如

[self addObserver:self forKeyPath:@"aProperty" options:0 context:nil];
[self addObserver:self forKeyPath:@"anotherProperty" options:0 context:nil];
...
我的问题是,在类的-dealoc方法中,我是否需要将实例作为自身的观察者删除?例如

[self removeObserver:self forKeyPath:@"aProperty"];
[self removeObserver:self forKeyPath:@"anotherProperty"];
...
按照我的理解,当一个对象试图向一个不再存在的对象发送消息时,就会抛出一个异常,这显然是一个问题。但在这种情况下,不再存在的对象不可能向自身发送消息,所以这应该不是问题

我还没有遇到任何问题,但它仍然有点困扰我,因为我从来没有看到它明确说明你可以这样做

我只是想避免写一大堆

[self removeObserver:self forKeyPath ...]

在my-dealoc方法中。

作为观察者,您可能不需要删除自己,但您不应该这样做。在执行添加观察者的操作时,…以后还必须执行删除观察者的操作


但是这个讨论无论如何都是无关紧要的,因为没有必要去观察自己,只要在你的财产的设定者中触发你的行为就行了。这将产生更清晰、可读性更强的代码,实际执行效果更好。

感谢您的回复。我的类有大量的属性,它们中的任何一个发生变化时都需要触发一个事件,所以我认为使用KVO和@synthesized setters比编写大量setters更方便。简单地说,观察self是有正当理由的,例如观察超类的只读属性(例如,当子类化NSNotification时)。另外,可能有KVO更新不是由setter触发的(而是由will/didChangeValueForKey:setter外部触发的)。另一个原因是CALayers和核心数据中的
@dynamic
属性,编写自己的setter会破坏自动setter功能。