NskeyeDunarchiver дросселирует при попытке безоговорочной более одного объекта

StackOverflow https://stackoverflow.com/questions/2752745

Вопрос

У нас есть пользовательский матричный класс, и мы пытаемся архивировать и неархировать Nsarray, содержащую четыре из них. Сначала, кажется, становится незаметным штрафом (мы видим, что initwithCoder называется один раз), но затем программа просто зависает, используя 100% CPU. Это не продолжается или не выводит никаких ошибок. Это соответствующие методы из класса Matrix (строки, столбцы и матрицы наши единственные переменные экземпляра):


-(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"];

}


-(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];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top