突然我在这一行得到了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;
}
我甚至不知道从哪里开始看?
有人可以帮忙吗?
答案 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]));
}
这似乎有效!