main.m中的EXC_BAD_ACCESS

Pet*_*erK 3 iphone exc-bad-access objective-c

突然,我在这一行得到了EXC_BAD_ACCESS:

int retVal = UIApplicationMain(argc, argv, nil, nil);
Run Code Online (Sandbox Code Playgroud)

这是代码:

int main(int argc, char *argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}
Run Code Online (Sandbox Code Playgroud)

我甚至不知道从哪里开始看?

有人可以帮忙吗?

con*_*are 10

对于任何EXC_BAD_ACCESS错误,您通常会尝试向已发布的对象发送消息.跟踪这些问题的最佳方法是使用NSZombieEnabled.

这实际上是从不实际释放一个对象,而是通过将其包装为"僵尸"并在其中设置一个标志,表示它通常会被释放.这样,如果你再次尝试访问它,它仍然知道在你犯错之前它是什么,并且通过这些信息,你通常可以回溯看看问题是什么.

当调试器有时会破解任何有用的信息时,它特别有助于后台线程.

但是,非常重要的是,您需要100%确保这仅在您的调试代码中,而不是您的分发代码.因为什么都没有发布,你的应用程序将泄漏,泄漏和泄漏.为了提醒我这样做,我把这个日志放在我的appdelegate中:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
  NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");
Run Code Online (Sandbox Code Playgroud)

  • 现在最好的方法是使用Instruments中的Zombies模板.它向您显示比调试器更多的信息:即,僵尸(或任何其他)对象的整个历史记录. (3认同)