【发布时间】:2015-07-09 14:18:02
【问题描述】:
今天遇到一个比较困惑的问题:
当我的应用程序启动时,我正在下载一些东西,并在解析响应后将数据写入 NSUserDefaults。 现在这工作正常,直到我最近发现有时我的整个 UI 冻结并且在我重新启动应用程序之前不会解冻。当我在调试器中点击暂停程序执行时,我得到:
文档说 NSUserDefaults 是线程安全的,据我所知,没有其他线程正在尝试访问用户默认值...
任何关于如何解决/进一步调试问题的想法将不胜感激!
提前致谢!
导致问题的代码:
这在我收到 web 服务的响应后调用:
+ (void)updateWithData:(NSData *)data
{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSError *error;
NSArray *decodedData;
if (data) {
decodedData = [NSPropertyListSerialization propertyListWithData:data
options:NSPropertyListImmutable
format:NULL
error:&error];
}
if (!error && decodedData) {
[userDefaults setObject:decodedData forKey:kUserDataUserDefaultsKey];
}
else{
NSLog(@"%@", error.localizedDescription);
}
}
【问题讨论】:
-
你能提供一些代码吗?
NSUserDefaults是线程安全的,因为当调用setValue: forKey:时,它会锁定对包含值的字典的访问。 -
您找到这个问题的原因了吗?我在同时使用 NSUserDefaults 时遇到了类似的死锁。
-
我遇到了类似的问题,我的问题是特定于设备的。在模拟器和大多数其他手机上没有问题,但在 iPhone 5s 上。我认为这是一个时间问题。如果我能把在某个地方延迟清理它?
-
在 iOS 11.2.5 上仍然不时发生
标签: ios objective-c nsuserdefaults deadlock