Не могу разобраться с сохранением файлов - PullRequest
0 голосов
/ 16 февраля 2012

Я пытаюсь сохранить свой объект в файловой системе на 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, но это не помогает.

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

Ответы [ 2 ]

3 голосов
/ 16 февраля 2012

Вы выпускаете data без распределения.

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

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

1 голос
/ 16 февраля 2012

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

Возможно, в вашем IRSkillsObject есть свойство, которое не сохраняется в -initWithCoder:

...