为什么EXC_BAD_ACCESS如此无益?

问题描述:

首先让我说,我来自Flash/AS3的背景,我认为它不像iPhone/Objective-C那样严格。为什么EXC_BAD_ACCESS如此无益?

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

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

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

+0

使用并遵循以下链接:http://www.touch-code-magazine.com/how-to-debug-exc_bad_access/希望它能解决您的问题。 – shah

因为Objective-C的运行时非常小且简单。实际上,您正在编写一个坐在金属上的原生应用程序。该应用程序不知道为什么你得到了一个EXC_BAD_ACCESS,它只知道你是否试图做一些事情,操作系统说不。 EXC_BAD_ACCESS表示您正试图访问操作系统未提供给您的内存空间。

在Flash,Java,.NET等中,有一个强大的,强大的运行库,为你运行你的应用程序。它有更多的上下文,并且知道更多关于正在发生的事情。因此,像这样的环境的好处是更清晰的错误消息,通常具有完整的堆栈跟踪。

Xcode可以帮助你,看看zombifying你的对象。如果你试图再次使用它们,它们将不再是分配它们,而会成为僵尸并尖叫血腥谋杀。这有助于确定原因。

您可能也想看看Technical Q&ADebugging Magic

+2

有关僵尸的详细信息,请搜索NSZombieEnabled – Joost

+0

感谢Matt是众多看似真正了解我问题精神的人之一。正如我所提到的,我知道有一些工具可以让我朝正确的方向发展,但我只是想知道为什么我需要这些额外的工具。好答案! :) – Dustin

+0

哦,谢谢你的僵尸提示,虽然它仍然不会告诉我哪个指针的名字... – Dustin

为什么不能告诉你更多的问题。

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

例如为什么没有说“EXC_BAD_ACCESS,你试图通过线123上的指针suchAndSuch,但是你是一个白痴,因为你发布它的第69行,所以它不是使用了”?

想想为了跟踪这一切,必须要做什么。在调试器下运行它,如果您想要调试,则在调试器中观察分配并释放。

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

运行时没有您的源代码。

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

通过调试器运行它。当得到EXC_BAD_ACCESS异常时,检查回溯,并在每个帧检查本地变量的值。另外,在这里和那里放置一些断言,以确保值是你期望的。