У нас есть пользовательский матричный класс, и мы пытаемся заархивировать и разархивировать NSArray, содержащий четырех из них. Первое, кажется, получает разархивированный штраф (мы видим, что initWithCoder называют однажды), но затем программа просто зависает, с помощью 100% ЦП. Это не продолжает или производить любые ошибки. Это соответствующие методы от матричного класса (строки, столбцы, и матрица является нашими единственными переменными экземпляра):
-(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];