2009-07-14 3 views
1

таНос как этотСохранение/загрузка массива 2D C с NSKeyedArchiver

int **terrain; 
terrain = malloc(sizeof(int*) * mapSize.x); 
for (int i = 0; i < mapSize.x; i++) { 
    terrain[i] = malloc(mapSize.y * sizeof(int)); 
} 

Используйте его. Преобразовать в NSData как перед сохранением

NSData *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 адреса тогда, когда я загружаю данные не указывают к правильным данным больше? Или у меня есть проблема с «байтов», как описано в Documentation

Если это адрес вопрос, я должен поставить цикл при сохранении преобразовать *int в NSData затем сохранить все те и воссоздать **int с другой для цикла/malloc?

ответ

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]; 
+0

+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];