【发布时间】:2009-11-08 19:05:40
【问题描述】:
我正在编写一个 iPhone 应用程序——某个社交网络的客户端。该应用程序支持多个帐户。有关帐户的信息存储在密钥存档中。
一种用于保存的方法:
- (void) saveAccounts {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
path = [path stringByAppendingPathComponent:@"accounts.bin"];
// NSMutableArray *accounts = ...;
[NSKeyedArchiver archiveRootObject:accounts toFile:path];
}
一种用于阅读的方法:
- (NSMutableArray *) loadAccounts {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
path = [path stringByAppendingPathComponent:@"accounts.bin"];
NSMutableArray *restoredAccounts = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
return [restoredAccounts retain];
}
saveAccounts 方法仅在添加/修改/删除某些帐户时使用。每次应用启动时都会使用loadAccounts 方法。没有任何其他代码可以访问此文件。
我和我的一位测试人员遇到了问题。在某个时刻,开始表现得像accounts.bin 不见了。如果loadAccounts 返回nil,则应用程序提供添加帐户。输入账号后(应用程序必须调用saveAccounts),应用程序可以正常工作,但是当我再次启动它时,它要求我再次添加帐户。唯一的解决办法就是将应用重新安装到 iPhone 上,重新安装后可以运行一段时间,但出现任何问题。
我们(我和遇到问题的测试人员)使用 3.1.2 的 iPhone 3G。 另一位测试人员在他的 iPhone 3GS 上使用 3.1.2 时没有遇到此问题。
知道为什么这个文件会消失吗?
更新
我在我的代码中发现了错误。有一个代码可以删除整个 Document 目录。因为这部分代码是与远程服务器相关的,所以很难追踪到这段代码。错误仅在非常罕见的情况下出现。
现在发现了错误,并更正了代码。 wkw的回答并没有解决我的问题,但它迫使我更深入地挖掘。谢谢!
【问题讨论】:
-
所以我猜 [[NSFileManager defaultManager] fileExistsAtPath: documentsDirPath isDirectory:&isDir] 可能是对那段代码的有用防御性补充......