首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NSArray转C数组

NSArray转C数组
EN

Stack Overflow用户
提问于 2009-06-18 09:25:34
回答 3查看 20.5K关注 0票数 19

我们能把NSArray转换成c数组吗?如果不是,我需要在opengl函数中提供c数组,其中c数组包含从there.suppose文件读取的顶点指针。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-06-18 10:22:51

答案取决于C数组的性质。

如果您需要填充一个已知长度的原始值数组,您可以这样做:

代码语言:javascript
复制
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]);

下面是一个示例,我们想要从一个NSArray创建一个新的C数组,并将数组项保留为Obj-C对象:

代码语言:javascript
复制
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-terminate操作,而不是传递其长度:

代码语言:javascript
复制
// 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);
票数 39
EN

Stack Overflow用户

发布于 2009-06-18 15:33:10

NSArray有一个用于为数组的子范围创建C数组的-getObjects:range:方法。

示例:

代码语言:javascript
复制
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);
票数 6
EN

Stack Overflow用户

发布于 2009-06-18 09:43:20

我建议你改变自己的想法,比如:

代码语言:javascript
复制
NSArray * myArray;

... // code feeding myArray

id table[ [myArray count] ];

int i = 0;
for (id item in myArray)
{
    table[i++] = item;
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1011711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档