我正在编写一个 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。另一位测试人员在使用 3.1.2 的 iPhone 3GS 上没有遇到此问题。
任何想法为什么这个文件会消失?
更新
我在我的代码中发现了错误。有一个代码可以删除整个 Document 目录。因为这部分代码是与远程服务器相关的,所以很难追踪到这段代码。错误仅在非常罕见的情况下出现。
现在发现了bug,并更正了代码。wkw的回答并没有解决我的问题,但它迫使我更深入地挖掘。谢谢!