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

2023-11-21

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

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. The MOC正在被释放,所以是时候拆除它的内容了
  2. 为此,所有注册MOs变成故障*
  3. 转动 a 的动作MO发生故障时发送 KVO 通知
  4. 观察者收到通知并尝试对其采取行动,点击了现在无效的MO在图中
  5. Core Data 因无效访问而引发异常
  6. 由于未知原因,该异常未传递给我的异常报告者
  7. The MOs 被释放,但异常使 Core Data 处于意外状态,因此MO释放崩溃

简而言之,真正的问题是观察者比环境更长久。不要允许他们这样做!任何观察到的物体MO也许还应该有一个强烈的参考MOC, like NSObjectController和朋友们一样。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 -[_PFManagedObjectReferenceQueue _queueForDealloc:] 中释放托管对象可能会崩溃? 的相关文章

随机推荐

  • 在appendChild之后添加事件监听器

    我创建一个元素 eltTooltip with document createElement等等并将其添加到 DOM 像这样 idTooltip包含id of eltTooltip document body appendChild elt
  • 如何在 java SSL 客户端应用程序中支持多个 TrustStore

    在我们的 java 应用程序中 我们需要使用 https 协议与 SSL 上的服务器列表进行通信 要通信的服务器列表将在运行时更改 最初我们没有任何服务器的证书 在运行时 我们将获取新的服务器证书并将公钥证书添加到信任库中 并且与服务器的任
  • 在 swift 中按串行顺序同步多个 Web 服务调用

    我点击 Web 服务 URL 10 次并得到响应 我在用Alamofire and SwiftyJSON 这是我的控制器代码 class ViewController UIViewController let dispatchGroup D
  • 从 ssl 迁移到非 ssl 时,会话不保存

    我有一个强制使用 ssl 的登录屏幕 如下所示 https www foobar com login然后他们登录后 就会转到主页 https www foobar com dashbaord 但是 我希望人们在登录后就不再使用 SSL 以节
  • z3python:将字符串转换为表达式

    鉴于x y z Ints x y z 和一个像这样的字符串s x y 2 z 5 有没有快速的方法将 s 转换为 z3 表达式 如果不可能 那么我似乎必须执行大量字符串操作才能进行转换 您可以使用Pythoneval功能 这是一个例子 fr
  • Rails:完全被delayed_job难住了。在任何地方都没有收到参数

    我正在尝试使用collectiveidea 的delayed job 在Rails 3 应用程序中发送邮件 如果我尝试定期发送邮件 deliver 它工作正常 但一旦我切换到延迟工作 事情就会崩溃 我在delayed job mysql表中
  • 如何使用 Json.NET 将 XML 序列化为 JSON 对象

    我可以将 XML 序列化为 JSON 字符串 如下所示 var xml new XmlDocument xml LoadXml
  • Javascript 在操作 DOM 时是同步的吗?

    我有一个带有类型字段输入的表单 我有几个单选按钮 根据我单击的单选按钮 输入类型字段中的值将会更新 之后 我将调用 Javascript 函数来执行某些操作 该函数将使用输入字段中更新的数量 文本 当然 将该数量传递给函数本身更安全 但是我
  • 如何在悬停时为元素设置动画

    我怎样才能让我的 div 当鼠标悬停在元素上时 元素会增长 并且内容会将文本大小更改为更大的大小 我把它们放在一个类中并尝试 size 150 and height 30px width 30px 第一次尝试根本不起作用 第二次代码只是让
  • 如何在Python抽象类中创建抽象属性?

    在下面的代码中 我创建了一个基本抽象类Base 我想要继承自的所有类Base提供name财产 所以我把这个财产 abstractmethod 然后我创建了一个子类Base 称为Base 1 它旨在提供一些功能 但仍然保持抽象 没有name财
  • 用于取消引用函数结果的 PHP 语法

    背景 在我经常使用的所有其他编程语言中 对函数的返回值进行操作很简单 而无需声明新变量来保存函数结果 然而 在 PHP 中 这似乎并不那么简单 示例1 函数结果是一个数组
  • 从外部解决方案使用 Windows 服务中托管的 WCF 服务

    我使用以下演练设置了一个托管在 Windows 服务中的 WCF 库 http msdn microsoft com en us library ff649818 aspx 消费者 winforms 位于相同的解决方案中 该解决方案位于我的
  • 如何引用不同工作表上同名的图表?

    我有两个包含图表的工作表 并使用宏来运行所有包含图表的工作表并更新绘制的值 但是 当我尝试在第一个图表之后引用工作表中的图表时 我遇到了问题 尽管工作表的引用发生了变化 但对图表的引用却没有变化 循环看起来像这样 For Each ws I
  • Flutter:检测键盘打开和关闭[重复]

    这个问题在这里已经有答案了 我有一个BottomNavigationBar在我的应用程序的最上层 我想检测应用程序 子树中基本上任何位置的键盘打开和关闭 这样我就可以显示和隐藏BottomNavigationBar每当键盘可见时 这是一个普
  • 如何从 Rust 写入特定的原始文件描述符?

    我需要写入文件描述符 3 我一直在寻找它 但文档很差 我唯一发现的是使用libc图书馆和fdopen方法 但我还没有找到任何关于如何使用它或在其上编写的示例 谁能给我提供一个在 Rust 中写入文件描述符的示例 您可以使用FromRawFd
  • 使用 OCaml 解析语法

    我有一个任务是使用 OCaml 为 玩具 语法编写一个 玩具 解析器 但不确定如何开始 并继续 这个问题 下面是一个 Awk 语法示例 type nonterm term symbol N of nonterm T of term type
  • Microsoft Teams 来电事件

    我想创建一个应用程序 当用户在 MS Teams 中接到电话时会收到通知 我的意思是我想在来电事件中订阅一些内容 然后根据来电信息执行某些操作 这可能吗 到目前为止 我在 SDK 中没有看到任何事件 现在似乎有一个功能可能适合这个 通话记录
  • 当输出分配给变量时获取管道的退出代码(命令替换)[重复]

    这个问题在这里已经有答案了 获取管道命令的退出代码工作正常 echo ABC false true echo PIPESTATUS 0 PIPESTATUS 1 PIPESTATUS 2 Output is 0 1 0 但是当我将输出分配给
  • 可以在套接字上使用 SO_LINGER 设置的“逗留时间”究竟是多少?

    手册页对这个选项几乎没有任何解释 虽然网络上和 StackOverflow 上的答案中有大量可用信息 但我发现那里提供的许多信息甚至是自相矛盾的 那么该设置的真正用途是什么 为什么我需要设置或更改它 当 TCP 套接字断开连接时 系统必须考
  • 为什么在 -[_PFManagedObjectReferenceQueue _queueForDealloc:] 中释放托管对象可能会崩溃?

    我偶尔会看到像这样的堆栈跟踪崩溃 0 libobjc A dylib 0x97dc0edb objc msgSend 27 1 com apple CoreData 0x97edcdc2 PFManagedObjectReferenceQu