更新 2:我找到了一种解决方法,即同步 MOC 释放和保存。请查看更新的项目。 https://github.com/shuningzhou/MOCDeadLock.git
注意:我让它更积极地失败。不要在真实设备上运行它!
更新:演示此问题的示例项目。 https://github.com/shuningzhou/MOCDeadLock.git
XCode 6.2:无法重现。
XCode 6.3:可重现。
XCode 6.4 beta:可重现。
===========================问题====================== =========
OSSpinLockLockSlow
我们的应用在升级到 XCode 6.3 后随机卡住。在我们的项目中,我们使用NSOperation
andNSOperationQueue
从我们的服务器获取数据,并使用 Core Data 进行数据持久化。
这个问题以前从来没有发生过!您可以从堆栈跟踪中看到我们的代码没有进行任何调用。我不确定从哪里开始调试。有人可以提供一些指导吗?
先感谢您!
请查看堆栈跟踪
编辑:
我们正在使用AFNetworking
并且我们NSOperations
是AFHTTPRequestOperation
. 我们添加了一些自定义属性并覆盖了方法-(void)start
:
- (void)start;
{
//unrelated code...
NSString *completionQueueID = [NSString uuid];
const char *cString = [completionQueueID cStringUsingEncoding:NSASCIIStringEncoding];
self.completionQueue = dispatch_queue_create(cString, DISPATCH_QUEUE_SERIAL);
//unrelated code....
[super start];
}
对于Core Data
,我们遵循thread-confinement
模式。我们managed object context
对每个线程都有单独的,并且上下文共享一个 static persistent store coordinator
。
编辑2:
更多信息:我发现当系统同时退出多个线程时会发生此问题。我们将托管对象上下文存储在线程字典中,并在线程退出时释放它们。
[[[NSThread currentThread] threadDictionary] setObject:dataManager forKey:@"IHDataManager"];
CPU 使用率约为 20%。