iphone - 尝试取消归档多个对象时,NSKeyedUnarchiver 会卡住

标签 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];
        }<br/>
    }<p></p>

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

<p>}
</p>


-(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 * weightMatrices = [NSArray arrayWithObjects:w1,w2,w3,w4,nil];
[NSKeyedArchiver archiveRootObject:weightMatrices toFile:@"weights.archive"];
NSArray * newWeights = [NSKeyedUnarchiver unarchiveObjectWithFile:@"weights.archive"];

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

让我们疯狂的是我们可以很好地归档和取消归档单个矩阵。我们已经(成功地)使用了比这四个组合大很多倍的矩阵来做到这一点。

最佳答案

在你的 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];

关于iphone - 尝试取消归档多个对象时,NSKeyedUnarchiver 会卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2752745/

相关文章:

ios - 页面 View Controller 未按照其编码的样式进行转换

iphone - Three20简单导航

ios - 如何使用 swift 4 在 objective-c 类中符合 swift 类委托(delegate)?

ios - 如何解析 NSArray 以仅获取每个数组条目的一部分?

javascript - Youtube 识别其已安装的应用程序 : how?

ios - 行距在 OHAttributedLabel 中不起作用

ios - 如果我要创建完全自定义的 getter 和 setter 方法,我还需要 @property 声明吗?

objective-c - 制作一个圆形的 NSSlide 外观和行为就像在 GarageBand 中一样

macos - 如何优雅地重置正在开发的 macOS 应用程序(使用 UserDefaults 和 Realm)?

php - 只允许特定的 iOS 设备查看网站