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