【问题标题】:Using Zombies in Xcode在 Xcode 中使用僵尸
【发布时间】:2011-11-26 04:41:40
【问题描述】:

我正在使用 Zombies 来尝试摆脱 EXC_BAD_ACCESS 错误。

在 Zombies 中,当应用崩溃时我收到此消息 -

一个 Objective-C 消息被发送到一个被释放的对象(僵尸) 地址:0x8955310。

我的问题是我接下来要做什么来解决这个问题?

【问题讨论】:

标签: ios xcode


【解决方案1】:

在 Xcode 中为您的方案打开 malloc 堆栈日志记录和僵尸,并在模拟器中运行应用程序。当消息发送给僵尸时,Xcode 应该进入调试器。在调试器提示符处运行此命令:

info malloc 0x8955310

(替换僵尸的实际地址!)您将获得分配和释放该地址时的堆栈跟踪。

【讨论】:

  • 我有一个非常愚蠢的问题 - 我到底在哪里运行命令 malloc_history PID 0xADDRESS |较少的。在终端?
  • 我已将答案更改为使用 gdb 的内置 malloc 历史支持。
【解决方案2】:

您很可能已经创建了一个对象,将其释放并随后向其发送了一条消息。

为确保不会发生这种情况,安全的做法是在使用完对象后将其设置为 nil

考虑:

NSMutableArray *a = [NSmutableArray array];
[a dealloc];
[a do_something_weird];

响应此消息,您的应用可能会崩溃(不会总是崩溃),因为释放后,您不再拥有此内存,它可能被其他对象使用。

如果您将此顺序更改为

NSMutableArray *a = [NSmutableArray array];
[a dealloc];
a=nil;
[a do_something_weird];

什么都不会发生。当您确定已使用该对象时,这是一种安全的做法。

您可能还想考虑使用Automatic Reference Counting 功能,它对内存管理有很大帮助。

【讨论】:

  • 嗨@JAM,我想他在问如何在遇到此问题的代码中获取对象(其地址为 0x8955310)。 :)
  • 我想“我接下来要做什么来解决问题”可以用一种以上的方式来解释:)
  • 啊哈,你是对的,我相信你的答案是得到对象后的解决方案。 :D
猜你喜欢
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多