Поскольку 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
будет легче справиться.