【问题标题】:NSUserDefaults objectForKey sometimes nilNSUserDefaults objectForKey 有时为零
【发布时间】:2017-01-20 04:19:00
【问题描述】:

我刚刚注意到我的**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 的设备。有人有想法么? 谢谢

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

【问题讨论】:

  • 可能你需要检查你是否将 nil 值保存到你的NSUserDefault,代码中没有什么比一半时间正确一半时间错误,它只在你的代码上
  • 设置时是否错过了[[NSUserDefaults standardUserDefaults] 同步]?
  • 我确认我没有写零。是的,当我写一个新值时,我会调用 syncrhonize。
  • 你说的那个新值可能是nil,在设置之前尝试打印它,或者检查setObject代码是否在其他地方被调用,通常不需要调用syncrhonize
  • 我没有在代码的其他任何地方设置它。发现这个问题后,我在启动开始时立即打印该值,并且不执行任何其他操作(打印其值并退出以进行调试除外)。如果我一遍又一遍地运行它,我发现它有时是有效的,有时是 nil

标签: ios nsuserdefaults


【解决方案1】:

在 didFinishLaunchingWithOptions 中尝试以下代码

斯威夫特 3.0

UserDefaults.standard.synchronize()

客观 - C

[[NSUserDefaults standardUserDefaults] synchronize];

【讨论】:

  • 请注意,根据documentation,此方法是不必要的,不应使用。
【解决方案2】:

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

我将运行方案更改为使用发布配置并在没有附加调试器的情况下在设备上运行应用程序,问题消失了,也就是说,每次执行时获取逻辑都会产生正确的值(大约 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多