【问题标题】:NSMutableArray disappears after app kill or restart using NSKeyedArchiver使用 NSKeyedArchiver 杀死或重新启动应用程序后,NSMutableArray 消失
【发布时间】:2011-06-13 21:40:20
【问题描述】:

我有一个将Task 对象(自定义类)存储在NSMutableArray 内的应用程序。 Task类符合NSCodingNSCopying协议,我也实现了encodeWithCoderinitWithCoder方法。

当用户向NSMutableArray list 添加新任务时,我使用NSKeyedArchiver 保存数组。 list 填充 UITableView

数据正在保存中,当我退出应用重新进入时,数据还在。当我使用另一个应用程序一段时间并回来时,数据仍然存在。但是,当我在多任务任务管理或重新启动设备中“杀死”应用程序时,数据消失了。下面是一些重要的sn-ps代码:

#define kFilename @"epapsTasksFile"

- (NSString *)dataFilePath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:kFilename];
}

- (void)viewDidLoad {

    NSString *filePath = [self dataFilePath];
    if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
        self.list = [[NSKeyedUnarchiver unarchiveObjectWithFile:kFilename] retain];
    }
    else {
        self.list = [NSMutableArray arrayWithCapacity:1];
    }

    ...
}

- (void)applicationWillResignActive:(NSNotification *)notification {
    NSMutableArray *updatedList = [[NSMutableArray alloc] initWithArray:self.list];
    [NSKeyedArchiver archiveRootObject:updatedList toFile:kFilename];
}

为什么我的应用程序被“杀死”或设备重新启动时不保存数据?另外,有趣的是,当我重新启动 iPhone 模拟器时,数据仍然存在。

【问题讨论】:

    标签: ios nsmutablearray nskeyedarchiver


    【解决方案1】:

    您需要保存数据
    ([NSKeyedArchiver archiveRootObject:updatedList toFile:kFilename];applicationWillTerminate委托方法中以及在终止时保存它。

    编辑: applicationWillTerminate在IOS4.0及以上不保证。

    最好检查archiveRootObject:toFile:的返回状态,看看数据是否存储正确。如您所见,可能是文件路径错误。

    【讨论】:

    • 这似乎不起作用。我添加了- (void)applicationWillTerminate:(UIApplication *)application { ... } - 但它没有用。 ... 中的代码是 NSKeyedArchiver 方法。可以把它放在控制器类中还是应该放在我的AppDelegate.m 类中?
    • @epaps 你是对的,虽然文档说,这个委托方法将被调用,看起来它不会(在 IOS4.0 及更高版本中)。这个stackoverflow.com/questions/4967745/… 表明您无法实现这一点(在终止应用程序的同时保存数据)。顺便说一句,你不能提前保存数据(我不知道你的应用程序逻辑,但如果你觉得数据很重要,你应该经常保存它吗?)
    • 是的,经常保存数据。我可以退出应用程序并保存所有内容。但是当我杀死它或重新启动设备时,已经保存的数据消失了。
    • @epaps 你如何检查数据不存在?您是否在保存数据时杀死了该应用程序?我刚刚检查了设备和模拟器:数据一旦保存(到文件)仍然存在,即使在终止应用程序或重新启动设备后也是如此
    • 数据已保存,我在应用程序和手机周围导航,并检查数据是否仍在应用程序中。然后我杀死该应用程序,然后将应用程序重新打开到数据应该出现的位置,但它不存在。正如我所提到的,当我在模拟器中执行此操作时它可以工作,但在我的设备上却不行。
    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多