NSManagedObjectContext中的NSOperation释放崩溃

时间:2013-07-26 16:49:02

标签: ios core-data nsthread nsoperation

当我在后台下载内容的NSOperation被解除分配时,我遇到了CoreData问题。

我正在使用嵌套的托管对象上下文,操作使用的上下文在-[NSManagedObjectContext performBlock:]中保护了所有内容

然而,在操作被解除分配的时候,我得到了以下堆栈的崩溃:

#0  0x022d9098 in objc_msgSend ()
#1  0x00bfb903 in _PFObjectIDFastHash64 ()
#2  0x029fbdb0 in __CFDictionaryHashKey ()
#3  0x029e13e2 in CFBasicHashFindBucket ()
#4  0x029e0e2d in CFDictionaryGetValue ()
#5  0x00c0a408 in -[NSPersistentStoreCache incrementRefCountForObjectID:] ()
#6  0x00c0a37e in -[NSSQLCore managedObjectContextDidRegisterObjectsWithIDs:] ()
#7  0x00cd378c in -[NSPersistentStoreCoordinator(_NSInternalMethods) _informAffectedStoresOfInterestByChildContextInObjectsWithObjectIDs:withSelector:] ()
#8  0x00c0a29f in -[NSPersistentStoreCoordinator(_NSInternalMethods) managedObjectContextDidRegisterObjectsWithIDs:] ()
#9  0x00cb41db in __95-[NSManagedObjectContext(_NestedContextSupport) managedObjectContextDidRegisterObjectsWithIDs:]_block_invoke_0 ()
#10 0x00c39cc1 in internalBlockToNSManagedObjectContextPerform ()
#11 0x025af014 in _dispatch_client_callout ()
#12 0x0259ed5f in _dispatch_barrier_sync_f_invoke ()
#13 0x0259eaa3 in dispatch_barrier_sync_f ()
#14 0x00c39c8b in _perform ()
#15 0x00c3a6e9 in -[NSManagedObjectContext(_NestedContextSupport) managedObjectContextDidRegisterObjectsWithIDs:] ()
#16 0x00cb41db in __95-[NSManagedObjectContext(_NestedContextSupport) managedObjectContextDidRegisterObjectsWithIDs:]_block_invoke_0 ()
#17 0x00c39cc1 in internalBlockToNSManagedObjectContextPerform ()
#18 0x025a0731 in _dispatch_barrier_sync_f_slow_invoke ()
#19 0x025af014 in _dispatch_client_callout ()
#20 0x0259f7d5 in _dispatch_main_queue_callback_4CF ()
#21 0x02a12af5 in __CFRunLoopRun ()
#22 0x02a11f44 in CFRunLoopRunSpecific ()
#23 0x02a11e1b in CFRunLoopRunInMode ()
#24 0x02dff7e3 in GSEventRunModal ()
#25 0x02dff668 in GSEventRun ()
#26 0x0120bffc in UIApplicationMain ()
#27 0x0000285d in main at /Users/mochs/Projects/12_IP_Lufthansa_Next/Lufthansa/Supporting Files/main.m:16
#28 0x00002785 in start ()

我真的不知道发生了什么事。我所知道的是:

  • 我正在使用ARC
  • 我正在使用嵌套的托管对象上下文
  • 操作使用自己的runloop
  • 计划和执行共享NSThread中的内容
  • 线程已共享,并且在取消分配操作时不会释放
  • 不久之后 - [NSOperation dealloc]应用程序在主线程中崩溃
  • 我在NSOperation的dealloc方法中使用[context reset]修复了我们之前的几个问题。此时并发类型为NSConfinementConcurrencyType,我没有使用performBlock:
    • 由于一些更改,我需要将上下文的并发类型更改为NSPrivateQueueConcurrencyType并使其使用performBlock:,现在错误又回来了。

我很确定对reset的调用并没有真正解决问题,而只是修复崩溃。我不知道究竟是什么导致了这种崩溃。

有人知道这个错误是什么吗?

祝你好运, 迈克尔

2 个答案:

答案 0 :(得分:0)

据我所知,Core Data不是线程安全的。在github上,你可以找到这些扩展,使Core Data线程安全Adam Roth

答案 1 :(得分:0)

最后我发现了这个问题。将所有上下文保存到持久性存储时,使用我在saveToPersistentStore:中使用的方法RestKit,并进行一些小的更改以符合我们的要求。

以下一行应该可以作为iOS5的修复工具,至少在iOS6上引起了这个问题:

[contextToSave obtainPermanentIDsForObjects:[[contextToSave insertedObjects] allObjects] error:&localError];

我必须进一步调查这个问题只发生在iOS6上(正确的知道,我们没有针对其他目标)在我向他们发送问题请求之前,但只是删除这一行就解决了这个问题。