NSKeyedArchiver странное поведение - сохраняет просроченные объекты
Я ломал голову над этим уже пару дней. У меня есть данные игрока, хранящиеся в отдельных документах.plist, которые создаются NSKeyedArchiver
, Все работает нормально по большей части; однако, когда я удаляю один из этих документов.plist, загружаю другой в объект проигрывателя и активирую NSKeyedArchiver
когда приложение входит в фоновый режим через -applicationDidEnterBackground:
, NSKeyedArchiver
воссоздает удаленный файл.plist... со всеми его старыми данными без изменений. Если, с другой стороны, я вызываю тот же самый метод архивации из segue или любым другим способом, он этого не делает. Восстанавливает файл при вызове из -applicationDidEnterBackground:
или же -applicationWillTerminate:...
которая сохраняет не только текущие данные активного объекта, но и удаленные (которые должны были быть перезаписаны, если это один и тот же объект) в два отдельных файла.
я пытался campsObject=nil;
(мой объект игрока) в методе delete, но, видимо, данные все еще где-то плавают в памяти.
Итак, мой вопрос, есть ли что-то особенное, на что я должен обратить внимание при использовании NSKeyedArchiver
от -applicationDidEnterBackground
так далее? Есть идеи?
Персонаж создается на контроллере представления создания персонажа и передается следующему:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
//Initialize Camp object if not done already
if (!campsObject) {
campsObject = [[Camp alloc]init];
}
//Set up documents directory based on character name input
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
documentsDirectory = [paths objectAtIndex:0];
if ([_characterName.text isEqual:@""]) {
_characterName.text=@"Default Character";
}
NSString *savedFileName = [NSString stringWithFormat:@"%@.plist",_characterName.text];
documentsDirectory = [documentsDirectory stringByAppendingPathComponent:savedFileName];
//Check to see if file exists and unarchive it as campsObject
NSLog(@"Directory Checked for is %@",documentsDirectory);
if ([[NSFileManager defaultManager] fileExistsAtPath:documentsDirectory]) {
NSLog(@"File exists!");
[self unArchiveObjects:self];
//[self screenUpdateKatalam];
}
else{
NSLog(@"File doesn't exist - will be created on exit, or backgrounding");
}
//Pass campsObject instance variable to next view controller
characterNameTextPassed=[NSString stringWithFormat:@"%@",_characterName.text];
NSLog(@"The character name passed will be %@",characterNameTextPassed);
ViewController *viewControllerInstance = [segue destinationViewController];
viewControllerInstance->campsObject=campsObject;
viewControllerInstance->documentsDirectory=documentsDirectory;
viewControllerInstance->characterNameTextPassed=characterNameTextPassed;
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
if ([title isEqualToString:@"Yes"]) {
[[NSFileManager defaultManager] removeItemAtPath: documentsDirectory error: nil];
[self hideAndDisableAllButtons];
campsObject=nil;
characterNamesArray=nil;
characterNameTextPassed=nil;
documentsDirectory=nil;
[self getCharacterNames:self];
[self refreshEntryScreen];
}
Является ли метод удаления (всплывающее предупреждение с вопросом, действительно ли вы хотите удалить)
- (IBAction)archiveCampsObject:(id)sender {
NSLog(@"File will be saved to %@",documentsDirectory);
[NSKeyedArchiver archiveRootObject:campsObject toFile:documentsDirectory];
}
это действие, которое архивирует объект
- (void)applicationDidEnterBackground:(UIApplication *)application {
[self archiveCampsObject:self];
NSLog(@"Background Saving Engaged!");
NSLog(@"Application going into the background");
}
это фоновый метод