В продолжение midpadi, многие использования NSArray должны быть заменены на NSSet. NSSet - это коллекция уникальных объектов. NSArray - это коллекция упорядоченных объектов. Если ваши объекты не имеют собственного порядка и являются уникальными, вам следует использовать NSSet.
Я очень часто сохраняю NSSet на уровне модели и позволяю компонентам пользовательского интерфейса, которым требуется заказ, создавать свои собственные NSArrays. Например, рассмотрим случай «списка друзей», состоящего из «друзей». Список друзей сам неупорядочен; это просто коллекция. И объекты должны быть уникальными. Однако на уровне пользовательского интерфейса вам нужен порядок, и вы можете даже захотеть поместить одного и того же собеседника в несколько групп (например, «Избранное» и «Не в сети»). Но это проблемы пользовательского интерфейса, и уровень модели не должен беспокоиться о них.
NSSet *buddies = [buddyList allBuddies];
BOOL isBuddy = [buddyList containsObject:buddy];
NSArray *buddyList = [[buddyList allBuddies] sortedAraryUsingSelector:[self buddySortSelector]];
Когда появляется новый друг, BuddyList публикует уведомление (BuddyListDidAddBuddiesNotification
), которое включает в себя NSSet добавленных друзей в его userInfo. Таким образом, элементы пользовательского интерфейса, которые наблюдают за этим, могут вставлять друзей в свои списки в любом порядке сортировки. Это делает анимацию списка очень простой, что намного сложнее, если вы поддерживаете все отсортированные версии на уровне модели.
Когда у вас есть два NSSets, довольно легко выяснить различия между ними и создать серию удалений и добавлений, чтобы превратить одно в другое (опять же, полезно для анимации). С NSArray сделать это гораздо сложнее.
Поэтому я рекомендую по умолчанию использовать NSSet. Вы должны использовать NSArray только тогда, когда вам действительно нужен порядок. Это, к сожалению, наоборот, как это делают большинство людей.