【问题标题】:Objective C - EXC_BAD_ACCESS目标 C - EXC_BAD_ACCESS
【发布时间】:2013-12-05 00:43:15
【问题描述】:

我的程序使用递归。我不能给你看代码,因为它很大。

如果我使用递归到 long 我得到这个

EXC_BAD_ACCESS (code=2, address = 0xb03b1fcc)

当我尝试打印带有此错误的对象时,我得到了

EXC_BAD_ACCESS (code=2, address = 0xb03b1fcc). The process has been returned to the state before expression evaluation.

这是什么意思?我该如何解决这个问题?

【问题讨论】:

  • 不幸的是,这是一个非常常见的错误,通常是因为空引用,这意味着当您尝试使用对象时,它的值为“nil”。除非您显示一些代码,否则很难为您提供帮助。
  • 我要检查的第一件事是被递归的对象是否可能为空,以及代码是否在对其进行操作之前检查它是否为空。
  • 您可以使用 stepper 找到哪条线通向它,然后发布您的代码的那部分。
  • 问题不在于某些东西是零; nil 不会导致错误的访问。您的问题是对象已被过度释放。第一个主要问题是您使用 ARC 吗?

标签: objective-c recursion exc-bad-access


【解决方案1】:

我的程序使用递归。我不能给你看代码,因为它很大。

就在那里,很可能是您的问题的根源。具体来说,你已经溢出了堆栈(即递归太深,堆栈上有太多垃圾)。

一般来说,在大多数基于 C 的系统上应避免深度递归,因为堆栈深度通常是有限的。

您应该考虑不使用递归进行重构。

【讨论】:

  • 如何处理溢出的堆栈。
【解决方案2】:

这意味着您正在尝试访问地址 0xb03b1fcc 的内存,但没有这样做的权限。通常这是内存分配/对象引用的问题,但是如果您说它仅在您进行深度递归时发生,则可能只是您发生了堆栈溢出(尝试访问堆栈之外的内存)限制)。

调试器应该将您指向导致错误内存访问的确切指令,但是如果问题确实是递归,您只需要使用更少的堆栈内存和/或减少递归深度。

【讨论】:

  • 我相信0xb03b1fcc 在堆栈上,因此,您可以更强烈地断言这是堆栈溢出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 2017-12-14
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多