【问题标题】:Unpredictable EXC_BAD_ACCESS and objc_msgSend_vtable5不可预测的 EXC_BAD_ACCESS 和 objc_msgSend_vtable5
【发布时间】:2011-04-13 23:07:42
【问题描述】:

我正在测试我的应用程序,但它突然出现了 EXC_BAD_ACCESS。现在这已成为一种半常规的事情,发生在某些版本上而不是其他版本上。它还在调试器中吐出很多错误,例如 objc_msgSend_vtable5 什么会导致这样一个奇怪的问题?

【问题讨论】:

  • objc_msgSend_vtable5 不是错误消息;它是 Objective-C 运行时中函数的名称。您正在查看的堆栈跟踪仅说明您的应用程序在崩溃时正在做什么;它没有说明这是什么类型的崩溃。

标签: cocoa random exc-bad-access


【解决方案1】:

看来是我的错。要解决这个问题,我需要做的就是致电retain

【讨论】:

【解决方案2】:

我最近也遇到了同样的错误。简短的版本:它发生是因为我有一个对象,该对象的委托已被释放。确保您可以控制您分配的任何委托的生命周期,无论是通过 Interface Builder 还是其他方式。

长版本:当 Objective-C 运行时尝试向最终释放和释放的对象发送消息时会发生错误。这不同于向 nil 对象发送消息(一个完全有效的 Objective-C 操作)。在这些情况下,运行时知道对象是 nil 并做出相应的响应。相反,在这种情况下,Objective-C 认为它有一个真实的、有效的对象可以与之通信,并将消息发送到一个不包含对象的地址。

在我的例子中,我有一个 NSTextView 类型的对象,它通过 Interface Builder 连接到一个委托。当使用 NIB/XIB 文件构建视图或视图控制器时,Cocoa 会按照指示连接所有子视图,包括连接您可能拥有的任何委托。

我的错误是我创建了 NSView 的子类,将其设为 NSTextViewDelegate,然后告诉 Interface Builder 将子 NSTextView 连接到该父视图。但是,在我对拥有的 NSViewController 进行的各种操作期间,我告诉 Cocoa 从视图层次结构中删除 NSView 并稍后重新插入。

AppKit 特别地 告诉您不要保留课堂中可能拥有的任何 IBOutlets,而是通过简单的分配来跟踪这些。这是因为 AppKit 会为您处理这些内存管理。我几乎不知道通过要求视图离开视图层次结构一段时间,我触发了 AppKit 来清理那个 NSView。由于只有 AppKit 对视图对象本身有任何保留,[pfft],因此它进入了以太。已解除分配。

由于我无法直接控制 NSTextView 的委托,因此 NSTextView 现在指向已释放的委托,即使它具有有效的父视图。下次它尝试向其委托发送消息时,Objective-C 运行时崩溃了。

因此,请确保委托是您拥有的,或者至少知道不会在不合时宜的时刻被释放。

【讨论】:

  • 我遇到了类似的错误,如果发生这种情况,Zombie Objects Instrument 将是追踪问题所在的好方法。有关详细信息,请参阅此答案:stackoverflow.com/questions/11170614/…
猜你喜欢
  • 1970-01-01
  • 2021-01-05
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
相关资源
最近更新 更多