2012-02-15 2 views
0

Я пытаюсь сохранить свой объект в файловой системе на iPad, но, похоже, я что-то делаю неправильно. Вот как я архивировать объект:Не могу понять, как сохранить файлы

NSString *localizedPath = [self getPlistFilePath]; 
NSString *fileName = [NSString stringWithFormat:@"%@.plist", character.infoName]; 
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:character]; 

fileName = [fileName stringByReplacingOccurrencesOfString:@" " withString:@"_"]; 
localizedPath = [localizedPath stringByAppendingPathComponent:fileName]; 

NSLog(@"File Path: %@", localizedPath); 

if(data) { 
    NSError *writingError; 

    BOOL wasWritten = [data writeToFile:localizedPath options:NSDataWritingAtomic error:&writingError]; 

    if(!wasWritten) { 
     NSLog(@"%@", [writingError localizedDescription]); 
    } 
} 

Теперь это создает Plist файл, который я могу видеть и читать в файловой системе. Когда я пытаюсь использовать следующее разархивировать его, хотя:

NSError *error; 
NSString *directory = [self getPlistFilePath]; 
NSArray *files = [[NSFileManager defaultManager]contentsOfDirectoryAtPath:directory error:&error]; 
NSMutableArray *characters = [[NSMutableArray alloc]init]; 

for(NSString *path in files) { 
    if(![path hasSuffix:@"plist"]) { 
     continue; 
    } 
    NSString *fullPath = [directory stringByAppendingPathComponent:path]; 
    NSData *data = [NSData dataWithContentsOfFile:fullPath]; 
    IRSkillsObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:data]; // get EXEC_BAD_ACCESS here... 
    [data release]; 

    [characters addObject:object]; 
} 

Я получаю сообщение об ошибке EXEC_BAD_ACCESS.

IRSkillsObject соответствует протоколу NSCoding. Вы можете видеть, я прокомментировал строку, в которой я получил ошибку.

Я уверен, что это то, что я делаю неправильно, но я просто не вижу его. Я попытался пройти через отладчик (помещая точку останова в метод initWithCoder: объекта), но я не получаю никаких ошибок. Фактически, он правильно помещает данные в объект, когда я смотрю. Но как только это происходит при загрузке данных, это дает ошибку. Я пробовал использовать метод retain, но это не помогает.

Любая помощь, которую вы можете предоставить, была бы принята с благодарностью!

ответ

1

При обнаружении ошибки EXEC_BAD_ACCESS. Обычно это потому, что некоторые данные были выпущены, но в коде все еще необходимо.

Может быть, есть свойство внутри IRSkillsObject не сохраняется в -initWithCoder:

+0

Это было именно оно. Я все еще новичок в управлении объектами c и памятью и таких (моя история в основном в .net ...). Когда я устанавливал данные (то есть 'infoName = [coder decodeObjectForKey: kNameKey];'), я устанавливал iVar для объекта, который затем отпустил элемент. Когда я закрепил его для себя. [Propertyname] (т. Е. 'Self.infoName = [coder decodeObjectForKey: kNameKey];'), он работал. –

3

Вы освобождаете data, не выделяя его.

NSData *data = [NSData dataWithContentsOfFile:fullPath]; 
IRSkillsObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
[data release]; 

Так попробуйте это:

NSData *data = [[NSData alloc] initWithContentsOfFile:fullPath]; 
IRSkillsObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
[data release];  
+2

или удалить строку [передаваемые данные]; – 0xDE4E15B

+0

Итак, возможно, это не перечисленные выше методы, которые вызывают проблему. Если я заменил '[NSData datawithContentsOfFile: fullPath];' с '[[NSData alloc] initWithContentsOfFile: fullPath];' он делает то же самое. Может быть что-то с моим объектом? Thanks –

+0

Есть ли другие файлы plist в той же папке? Если это так, удалите их все и попробуйте снова архивировать/разблокировать. – iDifferent

 Смежные вопросы

  • Нет связанных вопросов^_^