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