【发布时间】:2013-07-26 16:49:01
【问题描述】:
当在后台下载内容的 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
- 我正在使用嵌套的托管对象上下文
- 该操作在具有自己的运行循环的共享 NSThread 中调度和执行内容
- 线程是共享的,在释放操作时不释放
- 在 -[NSOperation dealloc] 后不久,应用程序在主线程中崩溃
- 我之前在 NSOperation 的 dealloc 方法中使用
[context reset]修复了我们的几个问题。这时候并发类型是NSConfinementConcurrencyType,我没有用performBlock:- 由于一些更改,我需要将上下文的并发类型更改为
NSPrivateQueueConcurrencyType并使其使用performBlock:,现在错误又回来了。
- 由于一些更改,我需要将上下文的并发类型更改为
我很确定对reset 的调用并没有真正解决问题,而只是修复了崩溃。我不知道究竟是什么导致了这样的崩溃。
有人知道这个错误是关于什么的吗?
最好的问候, 迈克尔
【问题讨论】:
-
“在 -[NSOperation dealloc] 应用程序崩溃后不久...”。这意味着什么?你打电话给dealloc吗?如果不是,你怎么知道?
-
我在那里设置了一个断点。在此之后,主线程上下文似乎发生了一些事情,它崩溃了。
-
很难确定。回溯看起来好像有一个
performBock:没有执行,并且崩溃发生在那个块中。调用reset大概取消了performBlock:。也许您在某个地方有一个performBlock:依赖于仍然存在的操作队列,如果不存在则崩溃? -
如果你在
dealloc中设置断点,你显然是在重写方法。也许你忘了打电话给[super dealloc];。 -
我在 dealloc 中添加了一个
performBlockAndWait:以确保没有任何内容未执行。同样的问题。所以在释放之前队列似乎是空的,这不是问题。 @Mundi:我使用 ARC,所以不需要[super dealloc]!
标签: ios core-data nsthread nsoperation