【问题标题】:NSUserDefaults in iOS is randomly disappearing and reappearingiOS中的NSUserDefaults随机消失并重新出现
【发布时间】:2017-09-03 21:52:59
【问题描述】:

只是想知道是否有人遇到过这个问题?

我目前正在使用 Objective-C 在 iOS 中开发应用程序。 有时我在编译应用程序后会丢失NSUserDefaults 中的数据。

但如果我忽略它并再次重新编译应用程序,数据会突然重新出现。

我已经在几个地方进行了同步(不是在每个键中,而是在几个地方)。

如果有人碰巧遇到过这个问题,希望你能分享一下如何处理这个问题。

附:我需要一个存储来保存 1 个特定对象,以便在应用重新打开时检索它。

编辑添加代码

NSString *enPIN = [[NSString alloc]initWithString:[NSString stringWithFormat:@"%@", [enterField.text md5]]];

[[NSUserDefaults standardUserDefaults] setObject:enPIN forKey:@"pin"];
[[NSUserDefaults standardUserDefaults]synchronize];

NSLog(@"check pin %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"pin"]);

该对象是一个字符串,我使用 md5 对其进行哈希处理,然后将其存储在 nsuserdefault 中,如果它只是随机消失可能并不奇怪,但如果我重新编译应用程序,它也会在消失后再次出现

【问题讨论】:

  • 存储对象如下面的答案链接中给出的以相同状态读取和存储。 stackoverflow.com/questions/2315948/…
  • 请出示您的代码。您是在设备还是模拟器上进行测试?如果一个模拟器,你总是使用同一个模拟器吗? synchronizeIan 没必要。
  • @Paulw11 hi paul 我编辑了我的问题以添加代码,我没有使用模拟器,我使用的是设备,ipad mini2,
  • 您的md5 扩展是否返回NSString?为什么要和initString & stringWithFormat 一起跳舞?为什么不简单地 NSString *enPIN = [enterField.text md5] ?检索时使用 stringForKey: 并且无需调用 synchronize - 摆脱它。
  • 是的,我再次看到它在我身边实际上是多余的,因为以前的代码,至于我在这里和那里搜索的同步,它需要确保,但问题仍然随机发生在我进行同步之前已经出现,并且同步没有任何效果。

标签: ios local-storage nsuserdefaults


【解决方案1】:

检查您的默认值是否仅使用字符串值或布尔值等。

如果您使用任何具有类(键和参数)的对象(如 NSObject)来存储默认值,我希望您在存储和检索值之前进行相应的编码和解码。

此外,如果您存储任何 NSDictionary,请检查该字典中的任何对象值是否不是 Bool、String 以外的任何值,如果还存储了任何 NSObject 类或引用,那么您可能会面临同样的问题。

请参阅stackoverflow link,了解在存储到 NSUserDefaults 之前如何编码对象。

最后 [defaults synchronise] 在 vi​​ewwilldisappear 时强制调用或在存储新值后立即调用,无论您的实现方式如何。

希望这会有所帮助。

【讨论】:

  • 您无需致电synchronize
  • 嗨,我编辑了我的问题以添加我的代码,我只在其中放入了一个散列的 md5 字符串,并对其进行了同步,奇怪的是,在它消失后,我再次编译它,并且值将正确地重新出现。
  • 你能做到吗,NSString *enPIN = [enterField.text md5]; [[NSUserDefaults standardUserDefaults] setValue:enPIN forKey:@"pin"]; [[NSUserDefaults standardUserDefaults] 同步]; NSLog(@"check pin %@", [[NSUserDefaults standardUserDefaults] valueForKey:@"pin"]);将日志放入 Didfinishlaunchwith Option 读取,App 将终止函数并检查在退出和进入应用时存储的值。
【解决方案2】:

前几天我在NSUserDefaults 上遇到了类似的问题

不太确定是什么原因造成的,但这是由于 Xcode 中的错误所致。我能够在完全不更改代码的情况下解决问题。我只是清理了项目(CMD-Shift-K)并重新启动了我的计算机,然后它就可以正常工作了。值得一试

您是否在控制台中收到任何类型的错误消息?

【讨论】:

  • 我在控制台中没有收到任何类型的错误消息,它只是成功保存到 NSUserDefaults,有时会随机消失,如果我在它消失后再次重新编译它会重新出现。我在应用程序打开时记录该值,它已经消失了
猜你喜欢
  • 2017-05-20
  • 2017-08-15
  • 2021-12-29
  • 2019-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多