Я пытаюсь использовать 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
.