NSUserDefaults boolForKey 的意外结果

Mah*_*nic 5 iphone

从设备完全卸载应用程序然后将其加载到调试器中后,我尝试在设置方法中使用 boolForKey 加载标志。应用程序第一次运行时,我期望 bool 不会存在,因为我刚刚重新安装了应用程序。我期望从文档中 boolForKey 将因此返回 NO。

我看到了相反的情况。boolForKey 返回 YES,这让我的初始用户设置变得很糟糕。知道为什么会发生这种情况或解决它的好方法吗?

BOOL stopAutoLogin = [[NSUserDefaults standardUserDefaults] boolForKey:@"StopAutoLogin"];
_userWantsAutoLogin = !stopAutoLogin;
Run Code Online (Sandbox Code Playgroud)

所以 stopAutoLogin 的结果是“YES”,这是完全出乎意料的。

陌生人和陌生人:当我调用 objectForKey:@"StopAutoLogin" 时,正如预期的那样,我得到一个 nil 对象。只是 boolForKey 返回错误值。所以我把代码改成这样:

// this is nil
NSObject *wrapper = [[NSUserDefaults standardUserDefaults] objectForKey:@"StopAutoLogin"];

// this is YES
BOOL stopAutoLogin = [[NSUserDefaults standardUserDefaults] boolForKey:@"StopAutoLogin"];
Run Code Online (Sandbox Code Playgroud)

Ale*_*gel 0

您是否为密钥注册了默认值?

NSMutableDictionary *appDefaults = [NSMutableDictionary dictionaryWithCapacity:1];
[appDefaults setObject:@"NO" forKey:kReloadOnStartKey];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults registerDefaults:appDefaults];
Run Code Online (Sandbox Code Playgroud)

如果没有注册域,则使用指定的字典创建一个注册域,并将 NSRegistrationDomain 添加到搜索列表的末尾。

注册域的内容不会写入磁盘;每次应用程序启动时都需要调用此方法。您可以将 plist 文件放置在应用程序的 Resources 目录中,并使用从该文件中读取的内容调用 registerDefaults: 。

请参阅此链接了解更多信息。