当尝试取消归档多个对象时,NSKeyedUnarchiver会发出ch咽声

时间:2010-05-02 07:16:19

标签: iphone objective-c cocoa macos nskeyedarchiver

我们有一个自定义矩阵类,我们正在尝试归档和取消归档包含其中四个的NSArray。第一个似乎得到了解压缩(我们可以看到initWithCoder被调用一次),但程序只是挂起,使用100%CPU。它不会继续或输出任何错误。这些是矩阵类的相关方法(行,列和矩阵是我们唯一的实例变量):


-(void)encodeWithCoder:(NSCoder*) coder {
    float temp[rows * columns];
    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < columns; j++) {
            temp[columns * i + j] = matrix[i][j];
        }
}

[coder encodeBytes:(const void *)temp length:rows*columns*sizeof(float) forKey:@"matrix"];
[coder encodeInteger:rows forKey:@"rows"];
[coder encodeInteger:columns forKey:@"columns"];

}

[coder encodeBytes:(const void *)temp length:rows*columns*sizeof(float) forKey:@"matrix"];
[coder encodeInteger:rows forKey:@"rows"];
[coder encodeInteger:columns forKey:@"columns"];

这就是我们所要做的一切:


-(id)initWithCoder:(NSCoder *) coder {
    if (self = [super init]) {
        rows = [coder decodeIntegerForKey:@"rows"];
        columns = [coder decodeIntegerForKey:@"columns"];
        NSUInteger * len;
        *len = (unsigned int)(rows * columns * sizeof(float));
        float * temp = (float * )[coder decodeBytesForKey:@"matrix" returnedLength:len];
        matrix = (float ** )calloc(rows, sizeof(float*));
        for (int i = 0; i < rows; i++) {
            matrix[i] = (float*)calloc(columns, sizeof(float));
        }
        for(int i = 0; i < rows *columns; i++) {
            matrix[i / columns][i % columns] = temp[i];
        }
    }
    return self;
}

我们尝试一次归档一个(没有NSArray),每个归档到一个不同的文件,但它仍然挂在第二个文件上。

令我们发疯的是,我们可以将单个矩阵归档和取消归档。我们已经(成功地)使用比这四个组合大很多倍的矩阵。

1 个答案:

答案 0 :(得分:2)

在你的initWithCoder方法中:

NSUInteger * len;
*len = (unsigned int)(rows * columns * sizeof(float));

从本质上讲,你将覆盖你的堆栈,这将导致不确定的结果。

应该是:

NSUInteger len = (unsigned int)(rows * columns * sizeof(float));
float * temp = (float * )[coder decodeBytesForKey:@"matrix" returnedLength:&len];