Цель C создание пользовательских массивов - PullRequest
1 голос
/ 24 июня 2009

В других языках я мог бы создать класс, а затем использовать его для создания массива объектов в этом классе, например, цена класса, которая используется в классе производительности для определения цены [] цены;

в задаче C я не могу заставить это работать, как ты это делаешь?

Ценовой класс является наследием NSObject. Могу ли я использовать NSMutableArray?

Ответы [ 3 ]

2 голосов
/ 25 июня 2009

Если у вас есть класс Price, и он наследуется от NSObject, тогда вы можете хранить их массив в NSArray или NSMutableArray.Вы также можете сохранить их в массиве C или в векторе STL, хотя в этих случаях семантика управления памятью может быть затруднена.

В случае NSArray / NSMutableArray массив принимает ссылку на владельца объекта., так что вы можете освободить его после добавления в массив, и он останется в памяти, пока не будет удален из массива (и всех других мест).

Код может выглядеть следующим образом:

NSMutableArray* a = [NSMutableArray array];
[a addObject:[Price price]];
// and/or
[a addObject:[[[Price alloc] init] autorelease];
// and/or
Price* p = [[Price alloc] init];
[a addObject:p];
[p release];
NSLog( @"The array is %@", a );
// Remember at this point you do not "own" a, retain it if you want to keep it, or use [NSMutableArray new] above

После освобождения a все содержащиеся в нем объекты Price будут освобождены (и потенциально освобождены).

1 голос
/ 24 июня 2009

Чтобы ответить на ваш последний вопрос первым: если вы храните экземпляры объекта Objective-C (который, как вы говорите, наследуют от NSObject), тогда да, используйте NSMutableArray . Однако это не будет работать для примитивных типов (таких как int, BOOL, char, char* и т. Д.).

Objective-C использует способ объявления массивов с одним предупреждением: вы не можете распределять память в стеке (что и делает в C), только в куче. Это означает, что вы должны использовать malloc (предпочтительнее NSAllocateCollectable() на Leopard или новее) и free для управления памятью. Кроме того, вы объявляете массив как указатель на массив или указатели. Примерно так: (Примечание: вытащено из воздуха, не проверено.)

Price **prices = malloc(numberOfEntries * sizeof(Price*));
...
free(prices);

Использование NSMutableArray, как правило, намного проще, чем управление собственными массивами. Просто помните о правилах управления памятью: коллекции вызывают -retain для объекта, когда он вставлен, и -release для него, когда он удаляется (или для всех объектов, если коллекция освобождена).

1 голос
/ 24 июня 2009

Да, NSMutableArray - это то, что вы хотели бы использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...