Класс имеет свойство (и экземпляр var) типа NSMutableArray с синтезированными аксессуарами (через @property
). Если вы наблюдаете этот массив с помощью:Наблюдение за NSMutableArray для вставки/удаления
[myObj addObserver:self forKeyPath:@"theArray" options:0 context:NULL];
И затем вставить объект в массиве, как это:
[myObj.theArray addObject:NSString.string];
An observeValueForKeyPath ... уведомление не отправлено. Тем не менее, на следующий же отправить надлежащее уведомление:
[[myObj mutableArrayValueForKey:@"theArray"] addObject:NSString.string];
Это происходит потому, что mutableArrayValueForKey
возвращает прокси-объект, который заботится уведомления наблюдателей.
Но не должны ли синтезированные аксессоры автоматически возвращать такой прокси-объект? Каков правильный способ обойти это - следует ли писать пользовательский аксессуар, который вызывает только [super mutableArrayValueForKey...]
?
Большой совет, спасибо. –
Проблема №1 заключается в том, что при добавлении наблюдателя вы наблюдаете свойство какого-либо объекта. Массив - это значение * этого свойства, а не свойство. Вот почему вам нужно либо использовать accessors, либо -mutableArrayValueForKey: изменить массив. –
Ваш последний пункт кажется устаревшим - я получаю бесплатные уведомления KVO о свойствах NSArray, если я реализую как добавление, так и удаление аксессуаров. – Bryan