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");

}

это фоновый метод

0 ответов

Другие вопросы по тегам