【问题标题】:When using KVO is it necessary to remove self as an observer of self in -dealloc?使用 KVO 时是否有必要在 -dealloc 中删除 self 作为 self 的观察者?
【发布时间】:2011-06-06 17:30:23
【问题描述】:

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

[self addObserver:self forKeyPath:@"aProperty" options:0 context:nil];
[self addObserver:self forKeyPath:@"anotherProperty" options:0 context:nil];
...

我的问题是,在类的 -dealloc 方法中,我是否必须将实例作为自身的观察者删除?例如。

[self removeObserver:self forKeyPath:@"aProperty"];
[self removeObserver:self forKeyPath:@"anotherProperty"];
...

按照我的理解,当一个对象试图向一个不再存在的对象发送消息时,就会抛出异常,这显然是一个问题。但在这种情况下,不再存在的对象不可能向自己发送消息,所以这应该不是问题。

我还没有遇到任何问题,但它仍然让我有些困扰,因为我从未见过它明确表示你可以这样做。

我只是想避免写一大堆

[self removeObserver:self forKeyPath ...]

在我的 -dealloc 方法中。

【问题讨论】:

    标签: objective-c key-value-observing


    【解决方案1】:

    您可能可以在不删除 self 作为观察者的情况下逃脱,但您不应该这样做。在你做addObserver:... 的地方你也必须稍后再做removeObserver:...

    但是无论如何这个讨论是无关紧要的,因为不需要观察self,只需在你的属性的setter中触发你的动作。这会产生更清晰、更易读的代码,实际上性能更好。

    【讨论】:

    • 感谢您的回复。我的类有很多属性,当其中任何一个发生变化时,它们都需要触发一个事件,所以我认为使用 KVO 和 @synthesized setter 比编写 bazillion setter 更方便。
    • 简要说明一下,观察自我是有正当理由的,例如观察超类的只读属性(例如在子类化 NSNotification 时)。也可能存在不是由 setter 触发的 KVO 更新(而是由 will/didChangeValueForKey: 在 setter 之外)
    • 另一个原因是 CALayers 和 Core Data 中的 @dynamic 属性,编写自己的 setter 会破坏自动 setter 功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多