Массив KVC: геттеры против индексированных методов доступа? - PullRequest
2 голосов
/ 23 августа 2010

Я смущен этим: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/AccessorConventions.html#//apple_ref/doc/uid/20002174-178830-BAJEDEFB

Предположим,

@interface Office : NSObject {
  NSMutableArray *employees;
}
  1. В чем преимущество реализации средств доступа к коллекции?

  2. Чем [anOffice countOfEmployees] лучше, чем [[anOffice employees] count]?

  3. Зависит ли привязка от средств доступа к коллекции или я могу полностью отказаться от них?Они кажутся мне излишними, так как я использую настоящий массив объектов.Я могу понять, как они были бы необходимы, если бы сотрудники не были NSMutableArray и не реализовали что-то вроде самого метода подсчета.

  4. Ятакже совершенно озадачен тем, почему бы использовать mutableArrayValueForKey:@"employees" для извлечения свойства сотрудников вместо просто valueForKey:@"employees".

Спасибо!

1 Ответ

3 голосов
/ 23 августа 2010

Вы можете отказаться от доступа к коллекции;они не требуются.Но они делают вещи намного проще.

Одной из причин их использования, включая countOfEmployees, является эффективность: метод employees может возвращать копию объекта массива (в частности, поскольку копия Office является изменяемой,поэтому Office не хотел бы, чтобы другие объекты изменяли массив из-под него), но если вам нужно только знать количество или получить доступ к одному объекту по определенному индексу, вам не нужна копия.

Другая причина в том, что отправитель хочет изменить свойство.

  • valueForKey: вызовет employees, что обычно возвращает неизменную копию.
  • Возврат изменяемой копии приведет кне поможет, так как изменение этого массива приведет к изменению копии, а не оригинала через свойство.
  • Возврат исходного массива не позволит отправителю отправлять уведомления KVO о его изменениях, поэтому ничто, наблюдающее за свойством, не узнаетоб этих изменениях.Это означает, что значения, отображаемые в вашем пользовательском интерфейсе, устареют (не будут обновлены).

mutableArrayValueForKey: возвращает поддельный массив, который отправляет сообщения о мутациях (или, если ничего больше, employees и * 1023)* сообщения) назад к исходному объекту.Сообщения о средствах доступа вызывают уведомления KVO, поэтому все, что наблюдает за свойством, будет сопровождаться этими изменениями, поэтому ваш пользовательский интерфейс будет в курсе.

Конечно, вы можете просто отправлять сообщения о средствах доступа самостоятельно.mutableArrayValueForKey: в основном, если вы хотите внести изменения в свойство, которое не известно во время компиляции;NSArrayController, по-видимому, один пользователь этого метода.Вам, скорее всего, не понадобится использовать mutableArrayValueForKey: в обычном приложении, и, на мой взгляд, легче отправлять сообщения о средствах доступа самостоятельно.

Все это относится и к Office, когдамутирует свой собственный массив.Он может просто напрямую общаться со своим объектом массива, но это не вызовет уведомлений KVO, поэтому ничто другое не будет знать, что значение свойства изменилось.Вы можете публиковать уведомления KVO самостоятельно о каждом изменении, но это легко и просто забыть.Средства доступа к коллекции и mutableArrayValueForKey: являются двумя решениями этих проблем: каждый доступ представляет собой одну строку кода, которая будет вызывать уведомления KVO.

...