NSZombieEnabled不起作用

onu*_*kin 15 iphone objective-c nszombie

当我设置NSZombieEnabled = Yes什么都没有写入控制台.我怎样才能解决这个问题?或者你能告诉我任何其他工具EXC_BAD_ACCESS吗?

bbu*_*bum 30

你有一个普通的老崩溃.EXC_BAD_ACCESS表示您的应用程序试图访问无效的内存地址.虽然在非GC的objective-c应用程序中最常见的原因是在解除分配后发送一个对象,这是Zombie Mode检测到的,但这种特殊的崩溃可以通过许多其他方式发生(如图所示).

由于您的应用程序崩溃,您应该有一个回溯.您需要在此发布该回溯,以便我们任何人能够进一步帮助您.

正如Brad所说,在启用调试的情况下运行应用程序.在Xcode中,您将在"运行"菜单下找到"运行/调试"菜单项.使用那个.当您的应用程序崩溃时,您应该在调试器窗口的左上角看到堆栈跟踪.

不,真的,它们确实出现在调试器中.一张图片值1000字. 替代文字http://www.friday.com/bbum/wp-content/uploads/2010/02/Crash.png

  • EXC_BAD_ACCESS崩溃,简单明了.调试器捕获所述崩溃并准确显示它发生的位置.为什么它首先发生的可能不像那张照片那么清晰. (10认同)
  • 这得到了我对"对新手最无益的答案"的投票.像我这样的每个新手都知道普通的旧EXC_BAD_ACCESS错误*不会*出现在调试器窗口中,在任何情况下都不会以凡人可以理解或有用的方式出现.如果他们这样做,CocoaDev或StackOverflow上的帖子数量很容易就是他们的一半.(好吧,我夸大了,四分之三). (7认同)
  • 喜欢文件名(但这是一个有用的截图+1) (2认同)

Lau*_*ble 10

"EXC_BAD_ACCESS"不一定与僵尸实例相关.它可以链接访问未定义的引用,如局部变量.

NSArray *array;
[array objectAtIndex:0]; // <- Will throw an error
Run Code Online (Sandbox Code Playgroud)

编辑: NSZombie标志只会帮助您解决使用解除分配的实例触发的"EXC_BAD_ACCESS".

为了解决这些错误,您必须使用崩溃回溯来查明错误的位置.然后,返回到您的代码并检查每个分配和分配.


xas*_*tor 6

还要确保在使用之前将所有指针初始化为nil!

如果您使用指针而不将其初始化为nil或任何其他对象,则可能最终会访问不属于您的内存.

例如,下面的代码也将提供一个EXC_BAD_ACCESS,它不能使用由最后一行引起的NSZombieEnabled标志来跟踪.

RecordingLocation* closest;

//find the closest recording location
for (...)
{
    //try to find the closest object...
    //suppose we don't find anything so closest is never set.
}

if (closest!=nil)
    NSLog(@"Closest: %f,%f",closest.x,closest.y);
Run Code Online (Sandbox Code Playgroud)


Nir*_*gas 6

我不明白这个问题的答案如何真正回答这个问题.

我问自己同样的事情.使用xcode4我已经启用了NSZobmieEnabled = YES以便在我访问已发布的对象时停止,而不是使用EXC_BAD_ACCESS崩溃 - 这非常有用.

手头的问题是:

"当我设置NSZombieEnabled =是没有任何内容写入控制台.我该如何解决这个问题......".

简单直接.

我遇到了同样的问题.xcode与调试器停止,但控制台不会产生任何消息.我希望有类似的东西:

"发送到解除分配的实例的消息......".