[...] можно ли проверить, действительно ли объект наблюдает это свойство?
Нет.При работе с КВО вы всегда должны иметь в виду следующую модель:
При создании наблюдения вы несете ответственность за удаление этого точного наблюдения.Наблюдение идентифицируется его контекстом, поэтому контекст должен быть уникальным.При получении уведомлений (а в Lion при удалении наблюдателя) вы всегда должны проверять контекст, а не путь.
Лучший способ обработки наблюдаемых объектов - удаление и установка наблюдения в установщике.наблюдаемого объекта:
static int fooObservanceContext;
- (void)setFoo:(Foo *)foo
{
[_foo removeObserver:self forKeyPath:@"bar" context:&fooObservanceContext];
_foo = foo; // or whatever ownership handling is needed.
[foo addObserver:self forKeyPath:@"bar" options:0 context:&fooObservanceContext];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (context == &fooObservanceContext) {
// handle change
} else {
// not my observer callback
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
- (void)dealloc
{
self.foo = nil; // removes observer
}
При использовании KVO вы должны убедиться, что оба объекта, наблюдатель и наблюдающий, живы, пока наблюдение находится на месте.
При добавленииНаблюдение вы должны сбалансировать это с одним удалением того же самого наблюдения.Не думайте, что вы единственный, кто использует KVO.Каркасные классы могут использовать KVO для своих собственных целей, поэтому всегда проверяйте контекст в обратном вызове.
Еще одна проблема, на которую я хотел бы обратить внимание: наблюдаемое свойство должно быть совместимым с KVO. Вы не можете просто наблюдать за чем-либо .