ios - 了解 Xcode 崩溃消息和 @synchronized 指令

标签 ios xcode multithreading atomic synchronized

尝试编写一些代码,除了使用全局变量单例之外,还使用 ​​iCloudKit 单例来跨多个方法调用共享变量和进程,可能来自多个 iPad。我有两个问题。

代码立即因这条消息而崩溃。

2015-06-09 18:31:18.879 iBeacons Demo[277:24157] *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSDictionaryM: 0x17024fdb0> was mutated while being enumerated.'

*** First throw call stack:

(0x184a742d8 0x1960340e4 0x184a73c8c 0x100024b0c 0x185975f9c 0x184a2c240 0x184a2b4e4 0x184a29594 0x1849552d4 0x18e0336fc 0x18951afac 0x10005eacc 0x1966b2a08)

libc++abi.dylib: terminating with uncaught exception of type NSException

据我了解,这是尝试通过两种方法来更改可变字典对象的共享实例中的值。对 OOC 有点陌生,对多线程环境和 xCode 中的编程同样陌生,我有一个愚蠢的问题。

我如何追踪 NSMutableDictionary 对象 0x17024fdb0 在这里也引用了哪个?

并且假设我发现它可能/可能的解决方法是像这样使其属性声明成为原子的,同时使用@synchronized 指令。

所以我有...

property (retain, atomic) NSDictionary blah 

@synchronized(self) {
  // do something quickly
}

最佳答案

此问题的典型根源很简单,就是您正在遍历数组(例如 for 循环或 enumerateObjectsWithBlock 或类似的东西)并尝试添加或删除对象,同时仍然遍历数组。这可能发生在最简单的单线程代码中,与同步多线程代码无关。

显然,如果您正在编写多线程代码,您也应该同步数组,无论如何,但这可能不是这里的问题。问题很可能只是改变数组,同时仍在 for 循环中迭代数组。


在您的回答中,您建议您删除其键存在于另一个数组中的所有字典键/值对。您当然可以使用 Tommy 建议的 allKeys 模式。或者,在这种情况下,使用 removeObjectsForKeys 可能很简单:

[students removeObjectsForKeys:descriptions];

关于ios - 了解 Xcode 崩溃消息和 @synchronized 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30738176/

相关文章:

ios - 看似无关的方法中的预期表达?

ios - 如何更改 IASKSpecifierValuesViewController 中的背景或文本标签颜色?

ios - 用于分析和登录的 GoogleService-Info.plist

xcode - 我什么时候应该检查 "Parallelize Build"以获得 Xcode 方案?

c++ - WaitForMultipleObjects 和 boost::asio 在多个 windows::basic_handle 上有什么区别?

objective-c - ZBarReaderView UIView 相机方向问题

ios - 没有 webview 的 ADAL 身份验证

swift - 无法获取结帐代码

linux - 线程如何平等地服务两个数据套接字(而不是控制套接字)?

c++ - 从线程中获取成员数据