Управление коллекциями кортежей в Objective-C - PullRequest
6 голосов
/ 21 июля 2009

Я довольно новичок в Objective-C и мне было интересно, как лучше всего управлять коллекциями кортежей. В C я бы использовал 2D-массив или структуру.

Должен ли я создавать объекты, содержащие эти кортежи? Это похоже на перебор для простой сортировки списков или нет реальной дополнительной нагрузки, генерируемой инициализацией объекта?

Ответы [ 3 ]

12 голосов
/ 21 июля 2009

Определенно есть некоторые издержки при создании объектов. Для небольшого числа объектов использование структур данных ObjC все еще целесообразно. Если у вас есть большое количество кортежей, я бы управлял ими в массиве Си. Помните, что Objective-C на самом деле является просто C. В Objective-C целесообразно и обычно использовать конструкции C (до некоторой степени; изучение того, где находится эта точка, представляет собой важный этап становления хорошего разработчика Objective-C).

Обычно для такого рода структуры данных я бы, вероятно, создал один объект Objective-C, который управлял всей коллекцией. Таким образом, внешние абоненты увидят интерфейс Objective-C, но внутренние данные будут храниться в более эффективной структуре C.

Если распространен быстрый доступ ко многим кортежам, мой объект коллекции, вероятно, предоставит методы get, аналогичные [NSArray getObjects:range:]. Методы ObjC, начинающиеся с «get», указывают, что первый параметр является указателем, который будет перезаписан методом. Это обычно используется для высокопроизводительного C-подобного доступа к объектам, управляемым объектом ObjC.

Такой тип структуры данных - именно то, как разработчики ObjC объединяют элегантность и удобство обслуживания ObjC с производительностью и простотой C.

1 голос
/ 21 июля 2009

Есть несколько способов сделать это:

  1. CoreData. Хотя технически это не база данных, она может вести себя очень похоже. Если вам не требуется постоянство между запусками приложения, рассмотрите возможность использования типа хранилища NSInMemoryStoreType, а не NSSQLiteStoreType или другого параметра. Однако, если вы хотите объединить кортежи вместе, использование CoreData абсолютно не будет работать (это, IMO, является основной причиной, по которой CoreData не база данных).
  2. Используйте реальную базу данных. SQLite поставляется на каждом Mac и iPhone и довольно прост в использовании, если вы используете оболочки типа FMDB или Постоянные объекты SQLite или База данных PLD или База данных EGOD или Оболочка GTMSQLite от Google .
  3. Кортеж на самом деле является просто набором пар ключ-значение, поэтому вы можете просто использовать NSMutableArray из NSMutableDictionaries. Вы, очевидно, не сможете использовать синтаксис SQL и любые объединения / запросы, которые вам придется выполнять самостоятельно, но это определенно будет иметь самую простую настройку.
  4. Напишите класс кортежей и сохраните их в NSMutableArray (аналогично # 3, просто принудительно применяйте общий набор атрибутов для ваших кортежей).
1 голос
/ 21 июля 2009

Я думаю, вам придется довольствоваться NSArray объектов NSArray или, возможно, NSArray объектов NSDictionary. Вы всегда можете бросить свой собственный класс или сделать то же самое, что и в C.

...