gpt4 book ai didi

cocoa - 为什么在 -[_PFManagedObjectReferenceQueue _queueForDealloc :]? 中释放托管对象可能会崩溃

转载 作者:行者123 更新时间:2023-12-03 16:06:18 24 4
gpt4 key购买 nike

我偶尔会看到像这样的堆栈跟踪崩溃:

0 libobjc.A.dylib 0x97dc0edb objc_msgSend + 27
1 com.apple.CoreData 0x97edcdc2 -[_PFManagedObjectReferenceQueue _queueForDealloc:] + 162
2 com.apple.CoreData 0x97edccbe -[NSManagedObject release] + 94
3 com.apple.CoreFoundation 0x9318ef38 CFRelease + 152
4 com.apple.CoreFoundation 0x931a7460 __CFBasicHashStandardCallback + 384
5 com.apple.CoreFoundation 0x931a706e __CFBasicHashDrain + 478
6 com.apple.CoreFoundation 0x9318f101 _CFRelease + 353
7 com.apple.CoreFoundation 0x931bbc6d _CFAutoreleasePoolPop + 253
8 com.apple.Foundation 0x973270aa NSPopAutoreleasePool + 76
9 com.apple.Foundation 0x97326fd2 -[NSAutoreleasePool drain] + 130
10 com.apple.AppKit 0x95087185 -[NSApplication run] + 627
11 com.apple.AppKit 0x9507f2d9 NSApplicationMain + 574
12 com.karelia.Sandvox 0x70001ef6 start + 54

不幸的是,它的重现相当随机。有谁知道什么可能导致这样的崩溃?之前似乎没有人在互联网上提到过 -_queueForDealloc: ,但这并没有帮助!

我对过去的类似问题有一个模糊的内存,这是在仍然附加了 KVO 观察者的情况下释放托管对象的症状。有人同意吗?

最佳答案

终于能够在开发计算机上重现该问题,看来这次崩溃是上下文拆卸期间早期异常的副作用。

事件的顺序类似于:

  1. MOC 正在被释放,因此是时候拆除其内容了
  2. 为此,所有注册的 MO 都会变成故障*
  3. MO 转变为故障的行为会发送 KVO 通知
  4. 观察者收到通知并尝试对其采取行动,在图表中命中现在无效的 MO
  5. 核心数据因无效访问而引发异常
  6. 由于未知原因,该异常未传递给我的异常报告者
  7. MO 被释放,但异常使 Core Data 处于意外状态,因此 MO 释放崩溃

简而言之,真正的问题是观察者比环境更长久;不要允许他们这样做!任何观察 MO 的对象可能也应该对 MOC 具有强引用,就像 NSObjectController 和 friend 所做的那样。

*我在测试中发现 Core Data 经常在后台线程上执行此操作,大概是为了避免阻塞主线程

MOC – 托管对象上下文
MO – 托管对象

关于cocoa - 为什么在 -[_PFManagedObjectReferenceQueue _queueForDealloc :]? 中释放托管对象可能会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5234139/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com