【发布时间】:2014-11-13 01:20:48
【问题描述】:
我有一个使用 [NSUserDefaults standardUserDefaults] 来存储会话信息的应用程序。 通常,此信息会在应用启动时检查,并在应用退出时更新。 我发现它在 iOS 8 中似乎运行不可靠。
我目前正在 iPad 2 上进行测试,但如果需要,我可以在其他设备上进行测试。
有时,退出前写入的数据不会在应用启动时保留。同样,退出前移除的键有时在启动后似乎存在。
我编写了以下示例,以尝试说明问题:
- (void)viewDidLoad
{
[super viewDidLoad];
NSData *_dataArchive = [[NSUserDefaults standardUserDefaults]
objectForKey:@"Session"];
NSLog(@"Value at launch - %@", _dataArchive);
NSString *testString = @"TESTSTRING";
[[NSUserDefaults standardUserDefaults] setObject:testString
forKey:@"Session"];
[[NSUserDefaults standardUserDefaults] synchronize];
_dataArchive = [[NSUserDefaults standardUserDefaults]
objectForKey:@"Session"];
NSLog(@"Value after adding data - %@", _dataArchive);
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"Session"];
[[NSUserDefaults standardUserDefaults] synchronize];
_dataArchive = [[NSUserDefaults standardUserDefaults]
objectForKey:@"Session"];
NSLog(@"Value before exit - %@", _dataArchive);
exit(0);
}
运行上面的代码,我(通常)得到下面的输出(这是我所期望的):
Value at launch - (null)
Value after adding data - TESTSTRING
Value after deleting data - (null)
如果我随后注释掉删除密钥的行:
//[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"Session"];
//[[NSUserDefaults standardUserDefaults] synchronize];
并运行应用程序三遍,我希望看到:
Value at launch - (null)
Value after adding data - TESTSTRING
Value after deleting data - TESTSTRING
Value at launch - TESTSTRING
Value after adding data - TESTSTRING
Value before exit - TESTSTRING
Value at launch - TESTSTRING
Value after adding data - TESTSTRING
Value before exit - TESTSTRING
但我实际看到的输出是:
Value at launch - (null)
Value after adding data - TESTSTRING
Value after deleting data - TESTSTRING
Value at launch - (null)
Value after adding data - TESTSTRING
Value after deleting data - TESTSTRING
Value at launch - (null)
Value after adding data - TESTSTRING
Value after deleting data - TESTSTRING
例如它似乎没有更新退出应用程序的值。
编辑:我在运行 iOS 7.1.2 的 iPad 2 上测试了相同的代码;它似乎每次都能正常工作。
TLDR - 在 iOS 8 中,[NSUserDefaults standardUserDefaults] 工作不可靠吗?如果是这样,是否有解决方法/解决方案?
【问题讨论】:
-
请说明您正在运行的设备。如果它是模拟器 - 虽然它应该工作,但我并不感到特别惊讶它没有。它有很多错误!
-
如果您在最初读取数据之前
synchronize怎么办?不确定这是否有必要,但关于NSUserDefaults的Apple 文档确实说您可以同步“如果您想将用户默认值更新为磁盘上的内容”NSUserDefaults -
@AirsourceLtd 我已经在上面更新了。这是在 iPad 2 上测试的。我有其他设备可用,所以我今天将尝试它们。
-
@Stonz2 感谢您的建议。刚才试过了,结果还是一样。
-
@Pavan 在我想出更好的解决方案之前,我编写了一个简单的类来保存/加载数据到/从 plist。
标签: ios objective-c ios8 nsuserdefaults