Но не должны ли синтезированные средства доступа автоматически возвращать такой прокси-объект?
номер
Какой правильный способ обойти это - я должен написать собственный аксессор, который просто вызывает [super mutableArrayValueForKey...]
?
Нет. Реализуйте массивы доступа . Когда вы вызываете их, KVO автоматически публикует соответствующие уведомления. Так что все, что вам нужно сделать, это:
[myObject insertObject:newObject inTheArrayAtIndex:[myObject countOfTheArray]];
и правильная вещь произойдет автоматически.
Для удобства вы можете написать addTheArrayObject:
аксессор. Этот метод доступа будет вызывать один из реальных методов доступа к массиву, описанных выше:
- (void) addTheArrayObject:(NSObject *) newObject {
[self insertObject:newObject inTheArrayAtIndex:[self countOfTheArray]];
}
(Вы можете и должны заполнить соответствующий класс для объектов в массиве вместо NSObject
.)
Тогда вместо [myObject insertObject:…]
вы пишете [myObject addTheArrayObject:newObject]
.
К сожалению, add<Key>Object:
и его аналог remove<Key>Object:
, в последний раз, когда я проверял, распознаются KVO только для установленных (как в NSSet) свойств, а не свойств массива, поэтому вы не получите с ними бесплатные уведомления KVO, если только реализовать их поверх аксессоров, которые он распознает. Я подал ошибку об этом: x-radar: // problem / 6407437
У меня есть список всех форматов селекторов доступа в моем блоге.