У меня странная проблема.
Мой класс объявляет свойство, которое просто удерживает указатель на объект C++:
@property (assign) CPPObject *representedObject;
В init
этого класса Obj-C я регистрирую сам класс в качестве наблюдателя, чтобы получить уведомление, когда кто-то присваивает что-то моему свойству (да, я мог бы написать собственный наборщик... anywho!).
[self addObserver:self
forKeyPath:@"representedObject"
options:NSKeyValueObservingOptionNew
context:nil];
Демпинг observationInfo
после регистрации в качестве наблюдателя выглядит нормально - должно быть зарегистрировано.
Однако мой observeValueForKeyPath:ofObject:change:context:
метод никогда не вызывается.
Рассмотрение связанных тем StackOverflow не помогло мне решить эту проблему.
Свойство правильно установлено с помощью установки object.representedObject
и т.д.
Любые подсказки, что может быть здесь рыбным?..
Плохая идея зарегистрироваться для self
в методе init
.?
Редактировать # 1
При использовании ручного сеттера вместо синтезируемого, который вызывается установщиком.
Если ваши наблюдения вообще не вызываются, я бы сначала предположил, что синтезированный аксессор не вызывается, возможно, потому, что кто-то напрямую обращается к ivars, чего вы не должны делать именно по этой причине. Попробуйте реализовать пользовательский сеттер (он может просто выполнить обычное назначение) и убедиться, что он вызван.
EDIT: мой следующий тест состоял бы в том, чтобы убедиться, что вы правильно назвали свой метод наблюдения. Я не знаю, является ли это Mac или iOS; на Mac, неправильное использование метода наблюдения не приведет к сбою приложения. На iOS это сработает, если только вам не удастся реализовать его где-то еще (суперкласс или реализовать в другом месте в вашей реализации).
Лично я мог бы вытащить минимальный тестовый пример в новый проект и посмотреть, можно ли воспроизвести его в одном файле. Я уверен, что когда вы закончите, это будет что-то глупое. Плохо названный метод. Два разных экземпляра одного класса (и вы смотрите на неправильный). Методы работают в том порядке, которого вы не ожидаете. Что-то вроде того.
[self will/didChangeValueFor:@"representedObject"]
вокруг назначения в установщике?
Вы должны использовать keyword
dynamic для достижения KVO, как описано в документации Apple KVO Observing