main.m中的EXC_BAD_ACCESS

时间:2011-06-14 20:50:31

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

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

int retVal = UIApplicationMain(argc, argv, nil, nil);

以下是代码:

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

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

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:10)

对于任何EXC_BAD_ACCESS错误,您通常会尝试向已发布的对象发送消息。追踪这些内容的最佳方式是使用NSZombieEnabled

这可以通过永远不会实际释放一个对象,但将其包装为“僵尸”并在其中设置一个标志,表示它通常会被释放。这样,如果您再次尝试访问它,它仍然知道在发生错误之前它是什么,并且通过这些信息,您通常可以回溯以查看问题所在。

当调试器有时会抓取任何有用的信息时,它特别有助于后台线程。

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

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
  NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");

答案 1 :(得分:4)

EXC_BAD_ACCESS是一个信号,表示您正在尝试访问已释放或不存在的内存中的变量。由于它在您的自动释放池释放后显示,这意味着您可能过度释放了具有挂起自动释放的变量,因此当自动释放池耗尽时,该变量不再存在以释放。

现在有很多问题要解决这个问题,其中最重要的问题是this one

答案 2 :(得分:1)

EXC_BAD_ACCESS通常表示您已过度释放内存。您可以使用Xcode中的“Build and Analyze”命令来帮助跟踪此问题。我还建议在整个代码中添加断点和日志语句以隔离错误。

答案 3 :(得分:0)

我遇到了这个问题,可能是因为您使用的是 Apple 最新的 main.m,它确实可以:

NSString * appDelegateClassName;

@autoreleasepool {
    // Setup code that might create autoreleased objects goes here.
    appDelegateClassName = NSStringFromClass([AppDelegate class]); }

return UIApplicationMain(argc, argv, nil, appDelegateClassName);

我不使用 ARC,而是将其更改为他们曾经使用的代码:

@autoreleasepool
{
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}

这似乎有效!