像这样的Malloc
int **terrain;
terrain = malloc(sizeof(int*) * mapSize.x);
for (int i = 0; i < mapSize.x; i++) {
terrain[i] = malloc(mapSize.y * sizeof(int));
}
使用它。 在保存
之前转换为NSdataNSData *data=[NSData dataWithBytes:terrain length:(30*sizeof(int*) +30*30*sizeof(int) )];
[rootObject setValue:data forKey:@"terrain"];
[NSKeyedArchiver archiveRootObject: rootObject toFile: path];
加载到NSdata然后转换回int**
rootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSData *data = [rootObject valueForKey:@"terrain"];
terrain =(int**) [data bytes];
使用此代码,是否保存*int
地址,然后当我加载数据时,它不再指向正确的数据?
或者我对“endianness”有问题,如中所述
Documentation
如果是地址问题,我应该在保存时将*int
转换为NSData,然后保存所有这些并重新创建**int
和另一个for loop / malloc吗?
答案 0 :(得分:1)
我没有对此进行过测试,但我怀疑使用上面的mallocs并不能保证你会分配一个连续的内存区域。
您可以做的是为所有mapSize.x字节数组分别保存数据:
int **terrain;
terrain = malloc(sizeof(int*) * mapSize.x);
for (int i = 0; i < mapSize.x; i++) {
terrain[i] = malloc(mapSize.y * sizeof(int));
}
...
for (int j = 0; j < mapSize.x; j++)
{
NSData *data=[NSData dataWithBytes:terrain[j] length:(mapSize.y * sizeof(int))];
[rootObject setValue:data forKey:[NSString stringWithFormat:@"terrain%i", j]];
}
[rootObject setValue:mapSize.x forKey:@"terrain"];
[NSKeyedArchiver archiveRootObject:rootObject toFile:path];
答案 1 :(得分:0)
我会在归档之前将2D数组转换为NSArrays,因为它可以为您节省很多麻烦。
NSMutableArray* terrainForArchiving = [NSMutableArray arrayWithCapacity:mapSize.x];
for(int col = 0; col < mapSize.x; ++col){
NSMutableArray* terrainCol = [NSMutableArray arrayWithCapacity:mapSize.y];
for(int row = 0; row < mapSize.y; ++row){
[terrainCol addObject:[NSNumber numberWithInt:terrain[col][row]]];
}
[terrainForArchiving addObject:terrainCol];
}
[NSKeyedArchiver archiveRootObject:terrainForArchiving];