Вы можете отказаться от средств доступа к коллекции; они не требуются. Но они значительно упрощают жизнь.
Одна из причин их использования, включая countOfEmployees, - эффективность: метод employees может возвращать копию объекта массива (особенно потому, что копия Office является изменяемой, поэтому Office не захочет, чтобы другие объекты изменяли массив из-под него), но если вам нужно знать только счетчик или получить доступ к одному объекту по определенному индексу, вам не нужна копия.
Другая причина заключается в том, что отправитель хочет изменить свойство.
valueForKey: вызовет employees, который обычно возвращает неизменяемую копию.
- Возврат изменяемой копии не поможет, поскольку изменение этого массива приведет к изменению копии, а не оригинала через свойство.
- Возврат исходного массива не позволит отправителю вызывать KVO-уведомления о его изменениях, поэтому никто, наблюдающий за свойством, не узнает об этих изменениях. Это означает, что значения, отображаемые в вашем пользовательском интерфейсе, устареют (не будут обновляться).
mutableArrayValueForKey: возвращает поддельный массив, который отправляет сообщения о мутации (или, если ничего другого, сообщения employees и setEmployees:) обратно исходному объекту. Сообщения аксессуаров действительно вызывают уведомления KVO, поэтому все, что наблюдает за свойством, будет следовать вместе с этими изменениями, поэтому ваш пользовательский интерфейс будет актуальным.
Конечно, вы можете просто отправить сообщения аксессора самостоятельно. mutableArrayValueForKey: в основном используется, если вы хотите внести изменения в свойство, которое неизвестно во время компиляции; NSArrayController, по-видимому, является одним из пользователей этого метода. Скорее всего, вам не понадобится использовать mutableArrayValueForKey: в обычном приложении, а саму отправку сообщений доступа, на мой взгляд, легче читать.
Все это относится и к Office, когда он изменяет свой собственный массив. Он мог просто разговаривать со своим объектом массива напрямую, но это не приводило бы к уведомлениям KVO, поэтому ничто другое не узнало бы об изменении значения свойства. Вы можете сами публиковать уведомления KVO при каждом изменении, но это хлопотно, и их легко забыть. Средства доступа к коллекциям и mutableArrayValueForKey: - два решения этих проблем: Каждый доступ представляет собой одну строку кода, которая вызывает уведомления KVO.
person
Peter Hosey
schedule
23.08.2010