Простой установщик в objc все еще генерирует уведомление об изменении значения - PullRequest
3 голосов
/ 24 марта 2011

У меня есть простой установщик, такой как

- (void) setValue: (int) newVal
{
    value = newVal;
}

, где value - int value; переменная экземпляра.

Как такое возможно, что использование [myobj setValue: 10]; все еще генерирует уведомление для наблюдателей, дажехотя мой установщик не делает никаких уведомлений явно (то есть он не вызывает willChangeValueForKey или didChangeValueForKey).

Не уверен, что это актуально или нет, но я использую старую Mac OS XОтличается ли это на iOS?

Ответы [ 2 ]

2 голосов
/ 24 марта 2011

вы можете реализовать:

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey

поищите в документации Apple для этого в руководстве KVO, и оно подробно расскажет, как подавить автоматическое уведомление KVO.

2 голосов
/ 24 марта 2011

Какао (и CocoaTouch) используют технику под названием " isa-swizzling " для автоматической поддержки KVO.

Он работает путем динамического создания подкласса класса наблюдаемого объекта, переопределяя установщик наблюдаемого свойства. Реализация переопределенного метода отправляет сообщения willChangeValueForKey: и didChangeValueForKey: (и, конечно, вызывает исходную реализацию между ними). ​​

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

...