为什么EXC_BAD_ACCESS如此无益?

时间:2010-01-13 21:33:26

标签: objective-c

首先让我说我来自Flash / AS3的背景,我发现它对iPhone / Objective-C等大多数事情并不严格。

我怀疑我的问题实际上也适用于AS3,但让我问它与Obj-c有关。为什么错误EXC_BAD_ACCESS和其他类似的错误如此无益?我意识到这通常意味着某处内存管理不善,但为什么它不能告诉你更多关于这个问题的信息。例如,为什么它没有说“EXC_BAD_ACCESS,你试图在第123行传递指针thisAndSuch,但是你是个白痴,因为你在第69行发布它所以它不再可用了”?

我意识到我可以使用调试器来获取有关我的错误发生位置的更多线索,但很多时候这只是略有帮助。例如,有时堆栈/线程/中的任何消息都不是我的代码。其他时候它是我的代码,但在堆栈的顶部将是一个有4个以上参数的消息,好的感谢调试器,你把它缩小到4个可能的指针,为什么你不能告诉我哪一个!?

我猜我只是因为背景而错过了一些基本的解释,不需要担心记忆等问题。虽然在AS3开发中可能会发生很多错误,但同样神秘并且沿着同样的路线发生。 “错误#1009:无法访问空对象引用的属性或方法”,这几乎总是意味着您期望持有的变量实际上是null。为什么不告诉我WHICH变量?!

4 个答案:

答案 0 :(得分:18)

因为Objective-C的运行时非常小而且简单,故意。你几乎正在编写一个坐在金属上的本机应用程序。该应用程序不知道为什么你有一个EXC_BAD_ACCESS,它知道你试图做什么,操作系统说没有。 EXC_BAD_ACCESS表示您正在尝试访问操作系统未提供给您的内存空间。

在Flash,Java,.NET等中,有一个庞大而强大的运行时,可以为您运行应用程序。它有更多的上下文,并且对正在发生的事情了解得更多。因此,像这样的环境的好处是更清晰的错误消息,通常具有完整的堆栈跟踪。

Xcode可以帮助您,查看对您的对象进行僵尸化。如果你再试一次使用它们,它们将成为僵尸并尖叫血腥谋杀,而不是解除它们。这有助于确定原因。

您可能还想查看Technical Q&ADebugging Magic

答案 1 :(得分:0)

  

为什么它不能告诉你更多关于这个问题的信息。

因为它没有比这更多的信息。当然,它可以跟踪所有类型的调试信息,但这会降低程序的速度。

答案 2 :(得分:0)

  

例如为什么不说“EXC_BAD_ACCESS,你试图在第123行传递指针这样的东西,但是你是个白痴,因为你在第69行发布它所以它不再可用了”?

想想要一直跟踪这个问题会发生什么。如果要调试它,请在监视alloc和调用的调试器下运行它。

  

虽然在AS3开发中可能会发生很多错误,但同样神秘并且沿着同样的路线发生。 “错误#1009:无法访问空对象引用的属性或方法”,这几乎总是意味着您期望持有的变量实际上是null。为什么不告诉我WHICH变量?!

运行时没有源代码。

基本上,这归结为“如果你想调试代码,在调试器下运行它。”

答案 3 :(得分:0)

通过调试器运行它。当您获得EXC_BAD_ACCESS异常时,检查回溯,并在每个帧检查局部变量的值。此外,在这里放置一些断言,以确保值符合您的预期。

相关问题