【问题标题】:Crash on NSOperation deallocation in NSManagedObjectContextNSManagedObjectContext 中的 NSOperation 释放崩溃
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 如上所述:我使用performBlock:方法和-initWithConcurrencyType:方法来初始化上下文!
  • Ops,对不起.. 我在下载管理器中遇到了类似的问题,问题是由于在 NSOperationQueue 中的 NSOperation 子类中设置完成和取消属性的​​顺序不正确造成的。我还开了一个问题stackoverflow.com/questions/9409994/…
【解决方案2】:

终于找到了问题所在。将所有上下文保存到持久存储时,使用我从 RestKit 使用的方法 saveToPersistentStore:,并进行了一些小的更改以满足我们的要求。

以下行应该可以作为 iOS5 上的修复程序,但至少在 iOS6 上会导致该问题:

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

在我向他们发送问题请求之前,我必须进一步调查该问题是否仅发生在 iOS6 上(没错,我们不是针对其他东西),但只需删除此行即可解决问题。

【讨论】:

  • @Mundi 哪个错误?你的意思是RestKit 中的修复?这是带有错误解释的原始实现:github.com/RestKit/RestKit/blob/…
  • 上面的localError 变量。
  • 它是零。该调用似乎使上下文处于无效状态。它甚至不会在那里崩溃。它会在几个运行循环周期后崩溃。
  • funny for me 添加这一行解决了我的崩溃 :) 当您在上下文中创建对象然后在另一个上下文中访问它时,必须协调这行代码。
  • 首先调用此行的目的是什么?我在 AlecrimCoreData 的上下文中遇到了类似的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
相关资源
最近更新 更多