Загрузить данные EXC BAD ACCESS (только устройство) - PullRequest
0 голосов
/ 11 марта 2011

Когда мои пользовательские данные загружаются на iPhone (3G, с 3.1), я получаю Exc Bad Access в этой строке:

NSMutableArray* dataArr = [NSKeyedUnarchiver unarchiveObjectWithFile:pathGG]; //=EXC BAD ACCESS

На Ipad и на симуляторе работают

Я сохраняю данные в симуляторе (в путь к DocumentsDirectory), затем заменяю данные в проект и загружаю из [NSBundle mainBundle]

В массиве я использую NSValue для магазина CGPoint.

Полный источник:

-(void) SaveData:(NSMutableArray*)dataLevel {
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentsDirectory = [paths objectAtIndex:0];
NSString* fileName = @"data.dat";
NSString* pathGG = [documentsDirectory stringByAppendingPathComponent:fileName]; // retain];

BOOL isWrite = [NSKeyedArchiver archiveRootObject:dataLevel toFile:pathGG];

if(isWrite) NSLog(@"YES");  
else  NSLog(@"!!!");
}

+(NSMutableArray*) LoadData  {
NSString* fileName = @"data.dat"; 
NSString* pathGG =  [[NSBundle mainBundle] pathForResource:fileName ofType:@"dat"]; // retain];
NSMutableArray* dataA = [NSKeyedUnarchiver unarchiveObjectWithFile:pathGG];  //EXC BAD ACCESS

return dataA;
}

Если я использую следующий способ (сохранение / загрузка тем же способом), я также получаю EXC BAD ACCESS:

NSKeyedUnarchiver* decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
NSArray* dataArr = [decoder decodeObjectForKey:@"dataLevel"]; //EXC BAD ACCESS

Ответы [ 2 ]

0 голосов
/ 13 марта 2011

РЕШЕНИЕ: Вместо сохранения CGPoint в NSValue используйте CGPointFromString (после NSStringFromCGPoint), а затем добавьте строку в массив.

NSString* positionStr = NSStringFromCGPoint(someCGPoint); 
[someArray addObject:position];
// Now, saving array to file
...

// После загрузки массива из файла

CGPoint positon = CGPointFromString([someArr objectAtIndex:0]);                  
0 голосов
/ 11 марта 2011

Попробуйте это:

NSString* pathGG = [[documentsDirectory stringByAppendingPathComponent:fileName] retain];

Затем, когда вы закончите с этим:

[pathGG release]
...