1

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

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

4

2 回答 2

1

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

AppDelegate尽快插入(inawakeFromNibapplicationWill/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:而不是使用NULLor进行测试nil

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

于 2016-04-08T09:35:12.420 回答
0

显然删除应用程序并重新安装可以解决问题。我猜从 9.3 升级到 9.3.1 时 NSUserDefaults 出了点问题

于 2016-04-08T11:07:35.877 回答