编码C样式的int数组

Axe*_*eva 5 iphone objective-c

我正在编写一个支持NSCoding的类.我设置encodeWithCoderinitWithCoder,和所有的标准Objective C的数据类型,做工精细.

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

int bonusGrid[5];
int scoreGrid[10][10];
int solutionGrid[10][10];
int tileGrid[10][10];
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

ugh*_*fhw 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;
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用memcpy()将数据移回到阵列中,但这不正确,并且不能保证在所有系统上都能正常工作(它可以在iPhone和Mac上运行).