编码C样式的int数组

时间:2011-02-12 01:59:50

标签: iphone objective-c

我正在编写一个支持NSCoding的类。我设置了encodeWithCoderinitWithCoder,所有标准的Objective C数据类型都可以正常工作。

我正在努力解决的是如何编码一些简单的C数组。例如:

int bonusGrid[5];
int scoreGrid[10][10];
int solutionGrid[10][10];
int tileGrid[10][10];

如果没有将它们分解并逐个编码每个int,我不知道如何处理它们。是否有一种“标准”方式来处理C数组?

谢谢!

2 个答案:

答案 0 :(得分:7)

一种方法是使用NSData来包装数组。

- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:[NSData dataWithBytes:(void*)bonusGrid length:5*sizeof(int)] forKey:@"bonusGrid"];
    [coder encodeObject:[NSData dataWithBytes:(void*)scoreGrid length:10*10*sizeof(int)] forKey:@"scoreGrid"];
    ...
}

- (id)initWithCoder:(NSCoder *)coder
    if((self = [super initWithCoder:coder])) {
        NSData *data = [coder objectForKey:@"bonusGrid"];
        int *temporary = (int*)[data bytes];
        for(unsigned char i = 0; i < 5; ++i) bonusGrid[i] = temporary[i];
        data = [coder objectForKey:@"scoreGrid"];
        temporary = (int*)[data bytes];
        for(unsigned char i = 0; i < 10; ++i)
            for(unsigned char j = 0; j < 10; ++j)
                scoreGrid[i][j] = temporary[i*10 + j];
        ...
    }
    return self;
}

你也可以使用memcpy()将数据移回你的阵列,但它不合适并且不能保证在所有系统上都能正常工作(它可以在iPhone和Mac上运行)。

答案 1 :(得分:0)

查看this问题的答案。它详细说明了将C数组转换为NSArray对象需要执行的操作。