NSUserDefaults objectForKey有时为零

时间:2017-01-20 04:19:00

标签: ios nsuserdefaults

我刚注意到**NSUserDefaults**中存在的密钥 经常回来零。它似乎只有一半的时间 是正确的,而另一半则没有。我说有一半的时间,但我没有 意味着它的翻转,只有40-50%,我觉得它不起作用。 当我写初始值时,我立即调用同步。 我使用此密钥作为应用程序 我在新用户注册时设置的修订版。

以下代码返回nil:

#define kDBrevision  @"revision"

NSString *rev = [[NSUserDefaults standardUserDefaults] objectForKey:kDBrevision];

当我启动应用程序并只监控值(没有 写任何NSUserDefaults),该值有时是有效的 完全没有修改NSUserDefaults。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSString *r = [[NSUserDefaults standardUserDefaults] objectForKey:kDBrevision];
    NSLog(@"revision %@", r);
    _exit(1);

我不知道为什么会这样。我正在运行iOS 10 设备连接到Xcode 8.2.1。有人有主意吗? 感谢

编辑: 我开始和苹果谈论解决这个问题并发现如果你有 文件保护完全打开,可能是导致此问题的原因 不时出现,然而苹果告诉我,我的特别 case(这是我此时唯一确定的)是一个错误。 这种情况是当您使用Xcode在设备上启动应用程序时 不会像这样失败,偶尔也会失败。不知道何时或是否会 固定。相反,我将我的关键字符串从默认值移动到 而是钥匙串。

2 个答案:

答案 0 :(得分:5)

这似乎是Xcode 8和/或iOS 10错误。我自己遇到了这个问题并最终将案例缩小到UserDefaults间歇性地返回nil,而实际上有关键的数据。具体来说,我设置数据一次,然后删除设置逻辑并重复执行get逻辑,有时得到值,有时得到nil。

我将Run方案更改为使用Release配置,并在没有附加调试器的设备上运行应用程序,问题就消失了,也就是说,每次执行时,get逻辑都会生成正确的值(~30次)。

以下是一些讨论:

iOS 10 with XCode 8 GM caused NSUserDefaults to intermittently not work

iOS 10, NSUserDefaults Does Not Work

https://forums.developer.apple.com/thread/48700

https://forums.developer.apple.com/message/143155#143155

答案 1 :(得分:0)

尝试下面的didFinishLaunchingWithOptions

中的代码

Swift 3.0

UserDefaults.standard.synchronize()

Obective - C

[[NSUserDefaults standardUserDefaults] synchronize];