Получение массива в стиле C из объектов NSArray - PullRequest
0 голосов
/ 06 сентября 2011

У меня есть NSArray arr. У него есть куча объектов NSNumber. Я пытаюсь вычислить статистический анализ массива, используя GNU GSL. GSL принимает параметры как массивы в стиле C.

Существует ли какой-либо механизм, который, например, может запускать intValue для всех объектов в объекте NSArray и преобразовывать результаты в массив в стиле C?

Я не хочу копировать содержимое NSArray в массив в стиле C, так как это пустая трата пространства и циклов, поэтому я ищу альтернативу.

Ответы [ 2 ]

4 голосов
/ 06 сентября 2011

Механизм, который вы описываете - запустите intValue для всех объектов в NSArray и передайте массив в стиле C - похоже, это то же самое, что вы описываете как «трата пространства и циклов».Это также единственный реальный способ сделать это, если вам нужен массив целых чисел в стиле C.Лучший подход, который я могу придумать:

int *c_array = malloc(sizeof(int) * [yourArray count]);
[yourArray enumerateObjectsWithOptions:NSEnumerationConcurrent 
                            usingBlock:^(id number, NSUInteger index, BOOL *unused) {
    c_array[index] = [number intValue];
}];
0 голосов
/ 06 сентября 2011

Попробуйте это:

id *numArray = calloc(sizeof(id), yourArray.count);
[yourArray getObjects: numArray range: NSMakeRange(0, yourArray.count)];

Это дает вам C-массив NSNumbers.Альтернатива, которая дает вам целые числа:

int *numArray = calloc(sizeof(int), yourArray.count);
for (int i = 0; i< yourArray.count; i++)
    numArray[i] = [[yourArray objectAtIndex: i] intValue];

Невозможно указать yourArray, чтобы он возвращал C-массив целых чисел напрямую.NSArray не имеет понятия содержимого, за исключением того, что они являются идентификаторами, и должны быть сохранены и выпущены в нужное время.В большинстве случаев он может возвращать C-массив идентификаторов, как в моем первом примере.

Вы, вероятно, могли бы написать свой собственный простой класс массива, который напрямую содержит целые числа (или числа с плавающей запятой или двойные числа и т. Д.), Во внутреннемМассив C, но для этого нет класса акций.

...