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] 之后不久,应用程序在主线程中崩溃
- 我之前
[context reset]
在 NSOperation 的 dealloc 方法中解决了我们几个相同的问题。这时候并发类型是NSConfinementConcurrencyType
,我没用performBlock:
- 由于一些更改,我需要将上下文的并发类型更改为
NSPrivateQueueConcurrencyType
并使其使用performBlock:
,现在错误又回来了。
- 由于一些更改,我需要将上下文的并发类型更改为
我很确定调用 toreset
并没有真正解决问题,而只是修复了崩溃。我不知道是什么真正导致了这样的崩溃。
有谁知道这个错误是关于什么的?
最好的问候,迈克尔