ios — наблюдаем, чтоValueForKeyPath не вызывается для свойства, содержащего объект C ++?

У меня странная проблема.

Мой класс объявляет свойство, которое просто хранит указатель на объект 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

При использовании ручного сеттера вместо синтезированного называется.

1

Решение

Если ваши наблюдения вообще не будут вызываться, я бы сначала заподозрил, что синтезированный метод доступа не вызывается, возможно, потому, что кто-то напрямую обращается к ивару, чего не следует делать именно по этой причине. Попробуйте реализовать пользовательский установщик (он может просто выполнить обычное назначение) и убедитесь, что он вызывается.


РЕДАКТИРОВАТЬ: Мой следующий тест будет убедиться, что вы правильно назвали свой метод наблюдения. Я не знаю, Mac это или iOS; на Mac неправильное наименование метода наблюдения не приведет к сбою приложения. На iOS это может привести к сбою, если только вы не внедрили его где-то еще (суперкласс или не реализовали где-то еще в вашей реализации).

Лично я, вероятно, вытащу минимальный тестовый пример в новый проект и посмотрю, сможешь ли ты воспроизвести его в одном файле. Я уверен, что когда вы закончите, это будет что-то глупое. Плохо названный метод. Два разных экземпляра одного и того же класса (и вы смотрите не на тот). Методы работают в порядке, который вы не ожидаете. Что-то вроде того.

1

Другие решения

Вы должны использовать keyword динамический для достижения КВО, как описано в документации Apple КВО Наблюдение

-1

По вопросам рекламы [email protected]