应用程序终止或使用NSKeyedArchiver重新启动后,NSMutableArray消失

时间:2011-06-13 21:40:21

标签: ios nsmutablearray nskeyedarchiver

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

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

正在保存数据,当我退出应用程序并重新输入时,数据仍然存在。当我暂时使用其他应用程序并返回时,数据仍然存在。但是,当我在多任务处理任务中“杀死”应用程序管理或重启设备时,数据就会消失。以下是一些重要的代码段:

#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模拟器时,数据仍然存在。

1 个答案:

答案 0 :(得分:1)

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

修改 applicationWillTerminate在IOS4.0及更高版本中不受保护。

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