Можно ли использовать «классический» malloc () / free () в приложениях Objective-C / iPhone? - PullRequest
53 голосов
/ 19 июля 2009

Я какое-то время играл с разработкой для iPhone, и, хотя вы чувствуете себя немного неловко, когда вы являетесь "хардкорным" разработчиком .NET, все не так плохо, как только вы к нему привыкнете. *

В каждой книге, которую я читаю о Objective-C, говорится только о сохранении / освобождении (подсчете ссылок) для управления памятью. Как разработчик старой версии C / C ++ для skool, кажется странным, что выделение «нормального» пути с использованием malloc () и free () упоминается только в некоторых сносках.

Я знаю, что malloc () и free () работают в Objective-C, но мне любопытно, является ли это обычной практикой или нет. В конце концов, если я хочу выделить массив из 100 целых чисел, кажется, что это самый эффективный способ сделать это:

int *array = malloc(sizeof(int) * 100);

memset(array,0,sizeof(int) * 100);

// use the array

free(array);

Это действительно лучший способ, или мне следует избегать простого управления памятью на С?

Ответы [ 5 ]

79 голосов
/ 20 июля 2009

В необработанной памяти есть обёртка Objective-C, которую я часто использую для подобных задач: NSMutableData. У него есть преимущество, позволяющее вам сохранять / освобождать владельца, а также он может легко увеличивать массив (без необходимости перераспределения ресурсов самостоятельно).

Ваш код будет выглядеть так:

NSMutableData* data = [NSMutableData dataWithLength:sizeof(int) * 100];
int* array = [data mutableBytes];
// memory is already zeroed

// use the array

// decide later that we need more space:
[data setLength:sizeof(int) * 200];
array = [data mutableBytes]; // re-fetch pointer in case memory needed to be copied

// no need to free
// (it's done when the autoreleased object is deallocated)
48 голосов
/ 19 июля 2009

Это прекрасно - Objective-C - строгий надмножество C, поэтому, если вы хотите написать простой C, ничто не мешает вам сделать это. Во многих случаях выгодно использовать malloc и free, чтобы избежать накладных расходов во время выполнения Objective C.

Например, если вам нужно динамически выделить массив с неизвестным числом целых чисел, это часто проще и проще:

int *array = malloc(N * sizeof(int));  // check for NULL return value!
// use array[0]..array[N-1]
...
free(array);

Versus:

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:N];
// use NSMutableArray methods to do stuff with array; must use NSNumbers instead
// of plain ints, which adds more overhead
...
[array release];

Я работал над игрой слов для iPhone, и нам пришлось загружать многомегабайтный словарь допустимых слов. Список слов был загружен в один гигантский массив char, выделенный с помощью malloc(), с некоторыми умными оптимизациями, чтобы еще больше уменьшить объем памяти. Очевидно, что для чего-то подобного накладные расходы на использование NSArray совершенно нецелесообразны для ограниченного iPhone. Я не знаю точно, что такое издержки, но это, конечно, больше, чем один байт на символ.

5 голосов
/ 19 июля 2009

Конечно, вы можете использовать эти функции, потому что Objective-C является просто надмножеством C. Однако делать это довольно редко, поскольку Objective-C содержит объекты и способы. чтобы сделать это проще.

В конце концов, вы могли бы написать приведенный выше код как:

NSMutableArray *array = [[NSMutableArray alloc] init];

//Use the array, adding objects when need be

[array release];

Хотя для хранения int s вам потребуется создать NSNumber объектов (поскольку NSArray не позволяет добавлять необъектные типы), обычно чаще используются объекты, потому что это легче перемещать данные, и классы массивов чаще интегрируются с другими классами Какао, а управление памятью, как правило, более простое, чем стандартное управление памятью C.

Кроме того, если вы начнете добавлять или удалять объекты из массива, то объекты массива Какао сделают это намного проще.

3 голосов
/ 20 июля 2009

Если вы имеете дело со стандартными типами C, это не менее распространено или «ОК», чем в C. Вот как это делается в C, который является частью Objective-C.

Также нет ничего необычного в том, чтобы написать какую-то обертку объектов вокруг этих вещей, чтобы привести ее в гармонию с остальной частью Какао (KVO, управление памятью и т. Д.). Таким образом, вы можете создать класс IntArray, который выполняет malloc за кулисами, чтобы вы могли сохранять и выпускать его по мере необходимости. Обратите внимание, что в этом нет особой необходимости - это может быть просто удобно, если такая структура является основной частью вашей программы.

2 голосов
/ 19 июля 2009

Прекрасно использовать malloc и свободно использовать собственное управление памятью. На самом деле NSObject allocWithZone: использует malloc для получения памяти.

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