Cocoa NSArray到C数组
我们能把NSArray转换成c数组吗。如果没有,还有什么替代方案。[假设我需要在opengl函数中输入c数组,其中c数组包含从plist文件读取的顶点指针]我建议您自己转换,使用类似于:Cocoa NSArray到C数组,cocoa,opengl,Cocoa,Opengl,我们能把NSArray转换成c数组吗。如果没有,还有什么替代方案。[假设我需要在opengl函数中输入c数组,其中c数组包含从plist文件读取的顶点指针]我建议您自己转换,使用类似于: NSArray * myArray; ... // code feeding myArray id table[ [myArray count] ]; int i = 0; for (id item in myArray) { table[i++] = item; } 答案取决于C数组的性质 如
NSArray * myArray;
... // code feeding myArray
id table[ [myArray count] ];
int i = 0;
for (id item in myArray)
{
table[i++] = item;
}
答案取决于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]);
或者,您可能希望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);
//生成一个以零结尾的C数组
int count=[nsArray count];
NSString**cArray=malloc(sizeof(NSString*)*(count+1));
对于(int i=0;i
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);
但这不会将NSNumber对象转换为基本数字类型。提问者需要转换使用OpenGL的C数组;因此,他们完全可以自己填充C数组,而不需要将NSNUMBER放入其中。啊!没有看到该问题的OpenGL要求。在这种情况下,是的,手动迭代数组是合适的。这是一个很好的答案,我希望我能多次投票。我有一个建议,就是
NSString**
类型的使用有点模糊。我建议对malloc返回的指针和数组大小使用[NSData initwithbytesnopy:length:freeWhenDone:][/code>。我尝试了使用malloc的第二种方法,我认为需要禁用arc。至少,我是这样让它工作的。当问到这个问题时,也许arc不存在。。。。
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);