Как мне отменить регистрацию на КВО на себя? - PullRequest
3 голосов
/ 02 февраля 2011

Я пытаюсь использовать KVO для наблюдения за свойствами подкласса UIView, чтобы вызвать рисование путем вызова drawRect:. В моем initWithFrame: у меня есть это:

...
self.observedKeysThatTriggerRedraw = [NSArray arrayWithObjects:@"name", nil];
for (NSString *aKey in self.observedKeysThatTriggerRedraw) {
    [self observeValueForKeyPath:aKey ofObject:self change:nil context:redrawContextString];
}
...

(redrawContextString - это константа NSString, уникальная для этого класса)

Уведомления KVO запускаются так, как должны, что корректно вызывает перерисовку. Проблема в том, чтобы отменить регистрацию КВО. Если я не отменяю регистрацию, все работает нормально, но я получаю исключение, если я помещу это наверху моего dealloc:

for (NSString *aKey in self.observedKeysThatTriggerRedraw) {
    [self removeObserver:self forKeyPath:aKey];
}

self.name = nil;
...
[super dealloc];

Я получаю это сообщение в консоли и вылетает при достижении removeObserver:forKeyPath::

CoreAnimation: исключение игнорируется: невозможно удалить наблюдателя для ключевого пути "name" из , поскольку он не зарегистрирован в качестве наблюдателя

Есть ли какая-то хитрость в отмене регистрации KVO, когда вы наблюдаете self? Являются ли мои наблюдатели незарегистрированными для меня в то время, когда вызывается dealloc? Я читал в нескольких местах, что вы не должны отменять регистрацию для KVO в dealloc, но я не уверен, где еще я могу сделать это, наблюдая self.

1 Ответ

1 голос
/ 02 февраля 2011

Вы фактически не зарегистрировали вид в качестве наблюдателя с addObserver:forKeypath:options:context:. Либо вы должны зарегистрировать себя в качестве наблюдателя, либо (если вы не используете KVO стандартным способом, отправляя вручную observeValueForKeyPath...), вы не должны пытаться отменить регистрацию себя в качестве наблюдателя.

...