这个问题已在SO中被问了几次,前两个答案是:
What's the best way to put a c-struct in an NSArray?
How can I create an NSMutableArray of structs?
Apple文档还显示了此过程:
共识似乎是通过NSValue将结构转换为对象。遵循这个建议我的问题是,当我取回数据时,我得到了虚假的结果。
我的结构非常简单:
typedef struct { uint8_t r, g, b, a; } Pixel;
正如上面的链接所解释的,我可以将它添加到数组
NSMutableArray *ledColors;
通过以下方式使用NSValue:
Pixel p_in = {0,0,0,1};
NSLog(@"Pixel in: %d %d %d %d",p_in.r,p_in.g,p_in.b, p_in.a);
NSValue *p_obj = [NSValue valueWithBytes:&p_in objCType:@encode(Pixel)];
// NSValue *p_obj = [NSValue value:&p_in withObjCType:@encode(Pixel)]; //this seems to work too.
for (int i=0; i<numLeds; i++) {
[ledColors addObject:p_obj];
}
但是,当我按照上面链接帖子中的描述检索/获取数据时,我不会得到原始的{0,0,0,1}而是随机整数:
Pixel p_out;
[[ledColors objectAtIndex:0] getValue:&p_out];
// Doesn't return the correct data
NSLog(@"Pixel out: %d %d %d %d",p_out.r,p_out.g,p_out.b, p_out.a);
答案 0 :(得分:2)
我刚刚运行下面的代码并且一切正常,这让我觉得问题出在其他地方。
Pixel p_in = {0,0,0,1};
NSLog(@"Pixel in: %d %d %d %d",p_in.r,p_in.g,p_in.b, p_in.a);
NSValue* v_in = [NSValue valueWithBytes:&p_in objCType:@encode(Pixel)];
NSMutableArray* arr = [NSMutableArray array];
[arr addObject:v_in];
Pixel p_out = {3,3,3,3};
[[arr objectAtIndex:0] getValue:&p_out];
NSLog(@"Pixel out: %d %d %d %d",p_out.r,p_out.g,p_out.b, p_out.a);
我的猜测是ledColors
是nil
,当你尝试取回对象时,这将无效,并在p_out
内留下未初始化的内存。