NSArray в массив C

мы можем конвертировать NSArray в массив c. если нет, то какие есть альтернативы. [предположим, мне нужно передать массив c в функции opengl, где массив c содержит указатель вершины, считанный из файлов plist]

Ответы на вопрос(3)

NSArray * myArray;

... // code feeding myArray

id table[ [myArray count] ];

int i = 0;
for (id item in myArray)
{
    table[i++] = item;
}

NSArray имеет-getObjects:range: метод для создания C-массива для поддиапазона массива.

Пример:

NSArray *someArray = /* .... */;
NSRange copyRange = NSMakeRange(0, [someArray count]);
id *cArray = malloc(sizeof(id *) * copyRange.length);

[someArray getObjects:cArray range:copyRange];

/* use cArray somewhere */

free(cArray);
 19 июн. 2009 г., 19:19
аааа! Не видел требования OpenGL для этой проблемы. В этом случае да, итерация массива вручную будет целесообразной.
 18 июн. 2009 г., 20:01
Однако это не преобразует объекты NSNumber в примитивный числовой тип. Спрашивающему нужно это преобразование, чтобы использовать массив C с OpenGL; из-за этого они могли бы также полностью заполнить массив C, не добавляя в него NSNumbers.
Решение Вопроса

Если вам нужно заполнить массив значений примитивов и известной длины, вы можете сделать что-то вроде этого:

NSArray* nsArray = [NSArray arrayWithObjects:[NSNumber numberWithInt:1],
                                             [NSNumber numberWithInt:2],
                                             nil];
int cArray[2];

// Fill C-array with ints
int count = [nsArray count];

for (int i = 0; i < count; ++i) {
    cArray[i] = [[nsArray objectAtIndex:i] intValue];
}

// Do stuff with the C-array
NSLog(@"%d %d", cArray[0], cArray[1]);

Вот пример, где мы хотим создать новый C-массив изNSArray, сохраняя элементы массива как объекты Obj-C:

NSArray* nsArray = [NSArray arrayWithObjects:@"First", @"Second", nil];

// Make a C-array
int count = [nsArray count];
NSString** cArray = malloc(sizeof(NSString*) * count);

for (int i = 0; i < count; ++i) {
    cArray[i] = [nsArray objectAtIndex:i];
    [cArray[i] retain];    // C-arrays don't automatically retain contents
}

// Do stuff with the C-array
for (int i = 0; i < count; ++i) {
    NSLog(cArray[i]);
}

// Free the C-array's memory
for (int i = 0; i < count; ++i) {
    [cArray[i] release];
}
free(cArray);

Или вы можете захотетьnil-определить массив вместо передачи его длины:

// Make a nil-terminated C-array
int count = [nsArray count];
NSString** cArray = malloc(sizeof(NSString*) * (count + 1));

for (int i = 0; i < count; ++i) {
    cArray[i] = [nsArray objectAtIndex:i];
    [cArray[i] retain];    // C-arrays don't automatically retain contents
}

cArray[count] = nil;

// Do stuff with the C-array
for (NSString** item = cArray; *item; ++item) {
    NSLog(*item);
}

// Free the C-array's memory
for (NSString** item = cArray; *item; ++item) {
    [*item release];
}
free(cArray);
 23 янв. 2017 г., 09:53
Я попробовал второй подход, который использует malloc, я думаю, что он требует отключения дуги. По крайней мере, так у меня получилось. Может быть, дуги не существовало, когда задавался этот вопрос ....
 29 сент. 2011 г., 22:18
Это отличный ответ, я бы хотел голосовать несколько раз. У меня есть одно предположение, что использованиеNSString** Тип немного запутанный. Я предлагаю использовать[NSData initWithBytesNoCopy:length:freeWhenDone:] с указателем, который возвращает malloc, и размером массива.

Ваш ответ на вопрос