从NSMutableArray中的C-Struct获取值

时间:2014-09-08 01:26:35

标签: objective-c macos cocoa struct nsmutablearray

这个问题已在SO中被问了几次,前两个答案是:

What's the best way to put a c-struct in an NSArray?

How can I create an NSMutableArray of structs?

Apple文档还显示了此过程:

https://developer.apple.com/library/mac/documentation/cocoa/Conceptual/NumbersandValues/Articles/Values.html

共识似乎是通过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); 

1 个答案:

答案 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);

我的猜测是ledColorsnil,当你尝试取回对象时,这将无效,并在p_out内留下未初始化的内存。