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