NSArray到C数组

pna*_*ndy 18 opengl cocoa

我们可以将NSArray转换为c数组.如果不是有什么替代方案.[假设我需要在opengl函数中提供c数组,其中c数组包含从plist文件中读取的顶点指针]

Wil*_*ris 39

答案取决于C阵列的性质.

如果需要填充原始值和已知长度的数组,可以执行以下操作:

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]);
Run Code Online (Sandbox Code Playgroud)

这是一个我们想要从中创建一个新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);
Run Code Online (Sandbox Code Playgroud)

或者,您可能希望 - 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);
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案,我希望我能不止一次投票.我有一个建议,即使用`NSString**`类型有点混淆.我建议使用`[NSData initWithBytesNoCopy:length:freeWhenDone:]`和malloc返回的指针,以及数组的大小. (2认同)

Ash*_*ark 6

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);
Run Code Online (Sandbox Code Playgroud)


mou*_*iel 5

我建议自己转换,例如:

NSArray * myArray;

... // code feeding myArray

id table[ [myArray count] ];

int i = 0;
for (id item in myArray)
{
    table[i++] = item;
}
Run Code Online (Sandbox Code Playgroud)