NSUserDefaults standardUserDefaults使用iOS 9.3.1停止工作

时间:2016-04-08 09:24:12

标签: ios xcode6 nsuserdefaults ios9.3

我在我的应用中使用此代码:

if ([[NSUserDefaults standardUserDefaults] objectForKey:@"First_RUN"] == NULL) {
    [self tutorial:nil];
    [[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"First_RUN"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

我正在使用此代码来了解应用程序第一次运行的时间,如果是这种情况我会显示教程。 升级到9.3.1后,我发现它已停止工作,因此每次应用程序运行时都会出现教程。 试图调试这个,但似乎[NSUserDefaults standardUserDefaults]刚刚停止工作。

我在这个应用程序中使用旧的Xcode(6.4)。以另一种方式使用[NSUserDefaults standardUserDefaults]或对此问题进行解释的任何帮助都会有所帮助(我的许多应用程序中都有这种代码,现在它们全部中断了。)

只是为了说清楚。这段代码完全适用于iOS 9.3,但不适用于iOS 9.3.1,我猜有些东西被破坏或改变了。

更新:我为此创建了一个测试项目(以隔离问题),似乎模拟器很好,但即使使用Xcode 7.3在9.3.1设备上运行同样的问题:https://sidan5@bitbucket.org/sidan5/nsuserdefaultsdemo.git

2 个答案:

答案 0 :(得分:1)

Apple建议注册默认值以获得可靠的默认状态。

尽快插入AppDelegate awakeFromNibapplicationWill/DidFinishLaunching

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *defaultValues = @{@"First_RUN" : @NO};
[defaults registerDefaults:defaultValues];

现在第一次运行时密钥始终为NO,您可以编写

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults boolForKey:@"First_RUN"] == NO) {
    [self tutorial:nil];
    [defaults setBool:YES forKey:@"First_RUN"];
}

使用布尔值或整数值,您始终可以使用NO / 0 / boolForKey:而不是integerForKey:NULL来测试nil

  

如果布尔/整数值与用户中的defaultName相关联   默认值,返回该值。否则,返回NO / 0.

答案 1 :(得分:0)

显然删除应用并重新安装即可解决问题。我想当NSUserDefaults从9.3升级到9.3.1时出现了问题