iOS 8在更新UserDefaults对象时冻结

Gui*_*rme 2 objective-c nsuserdefaults ios

我有一个存储到的对象队列NSUserDefaults.当我需要向其添加对象时,我调用以下方法:

+ (void)addCodeToQueue:(Code *)code {
  // Note: userDefaults is a static, initialized variable

  NSDictionary *codeModel = [self generateCodeModelWith:code];

  // Read array from UserDefaults, or create one if nil
  NSMutableArray *codeQueue = [userDefaults mutableArrayValueForKey:@"CodeQueue"] ? : [[NSMutableArray alloc] init];

  // Add code model
  [codeQueue addObject:codeModel];

  // Add/replace array & sync
  [userDefaults setObject:codeQueue forKey:@"CodeQueue"]; // App freezes here if uncommented
  [userDefaults synchronize];
}
Run Code Online (Sandbox Code Playgroud)

我打电话时我的应用程序冻结了setObject:forKey.如果我在该行添加一个断点,继续运行,它就可以了.如果我不打破,它会冻结.

在我将Xcode更新到版本8并开始使用新SDK之后,这种情况就开始发生了.有什么暗示吗?

小智 15

我在几个应用程序中也遇到了这个问题 - 似乎通过mutableArrayValueForKey返回可变数组,你可能会陷入互斥锁.对于我的代码,我把它换成了:

  • 获取不可变数组作为NSArray*arrSource = [defaults arrayForKey:strKey];
  • 将数据复制到可变数组中:NSMutableArray*arrMutable = [NSMutableArray arrayWithArray:arrSouce];
  • 在arrMutable中设置我的值...
  • 将"modified"数组存储回默认值:[defaults setObject:arrMutable forKey:strKey];

...对我来说,至少,这已经修复了互斥锁问题.