При использовании 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, просто запустите ваше действие в установщике вашей собственности. Это приводит к более четкому, более читабельному коду, который на самом деле работает лучше.

Другие вопросы по тегам