Использование malloc для выделения массива строк NSStrings? - PullRequest
2 голосов
/ 19 июля 2011

Поскольку длина NSSstring не определена как целое или двойное, могу ли я столкнуться с проблемами при выделении для него массива строк NSS с помощью malloc?

спасибо

есть:

NSString ***nssName;
nssName = (NSString***) malloc(iN * sizeof(NSString*));

конечным результатом для for_loops для строк является двумерный массив, поэтому работать с ним немного проще, чем с NSArray (меньше кода).

Ответы [ 5 ]

3 голосов
/ 19 июля 2011

Никаких проблем возникнуть не должно, выделение массива NSStrings похоже на создание массива указателей на строковые объекты.Указатели имеют постоянную длину.Я бы порекомендовал просто использовать NSArray, но все еще нормально использовать массив C NSStrings.Обратите внимание, что это могло измениться с ARC.

Вот вполне приемлемый код, демонстрирующий это:

NSString** array = malloc(sizeof(NSString*) * 10); // Array of 10 strings
array[0] = @"Hello World"; // Put on at index 0
NSLog(@"%@", array[0]); // Log string at index 0
3 голосов
/ 19 июля 2011

Поскольку NSString является объектом (а точнее: кластером объектов ), вы не можете знать его окончательный размер в памяти, только Objective-C. Поэтому вам нужно использовать методы распределения Objective C (например, [[NSString alloc] init]), вы не можете использовать malloc.

Проблема также в том, что NSString - это объектный кластер , что означает, что вы получаете не экземпляр NSString, а подкласс (о котором вы можете даже не знать и не беспокоиться). Например, очень часто реальным классом является NSCFString, но как только вы вызываете некоторые методы, которые обрабатывают строку как путь, вы получаете экземпляр NSPathStore2 или любой другой). Думайте о NSString методах init как о фабриках (как в Factory Pattern).

После редактирования вопроса:

Что вы действительно хотите:

NSString **nssName;
nssName = (NSString**) malloc(iN * sizeof(NSString*));

А потом что-то вроде:

nssName[0] = @"My string";
nssName[1] = [[NSString alloc] init];
...

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

Но остерегайтесь управления памятью: во-первых, вы должны убедиться, что массив заполнен NULL, например, с bzero или с использованием calloc:

bzero(nssName, iN * sizeof(NSString*));

Затем перед free массивом вам нужно release каждой строки в массиве (и убедитесь, что вы не сохраняете автоматически освобожденные строки; сначала вам нужно их сохранить).

В общем, у вас здесь гораздо больше подводных камней. Вы можете идти по этому маршруту, но с помощью NSArray будет легче справиться.

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

С NSString можно обращаться только через указатели, так что вы просто создадите массив указателей на NSString.Указатели имеют определенную длину, так что это вполне возможно.Тем не менее, NSArray обычно является лучшим вариантом.

0 голосов
/ 19 июля 2011

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

0 голосов
/ 19 июля 2011

Вы должны alloc / init... NSString* s или использовать фабричные методы класса. Если вам нужен их массив, попробуйте NSArray*.

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