При использовании KVO необходимо ли удалять себя как наблюдателя self в -dealloc?
В методе -init моего подкласса NSObject экземпляр добавляет себя в качестве наблюдателя некоторых собственных ключей keyPath для запуска действия, которое должно происходить каждый раз, когда изменяется одно из рассматриваемых свойств. например.
[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.
1 ответ
Вы, вероятно, могли бы уйти, не удаляя self
как наблюдатель, но вы не должны. Где вы делаете addObserver:...
Вы также должны сделать removeObserver:...
потом.
Но эта дискуссия в любом случае не имеет значения, потому что нет необходимости соблюдать self
, просто запустите ваше действие в установщике вашей собственности. Это приводит к более четкому, более читабельному коду, который на самом деле работает лучше.