问题描述
|
突然我在这条线上得到了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,nil);
[pool release];
return retVal;
}
我什至不知道从哪里开始寻找?
谁能帮忙吗?
解决方法
对于任何EXC_BAD_ACCESS错误,您通常尝试将消息发送到已发布的对象。追踪这些问题的最佳方法是使用NSZombieEnabled。
通过从不实际释放对象,而是将其包装为“僵尸”并在其中设置一个标志来表示该对象通常会被释放,从而起作用。这样,如果您尝试再次访问它,它仍然会在发生错误之前知道它是什么,并且借助少量信息,通常可以回溯以查看问题所在。
当调试器有时会发掘任何有用的信息时,它特别有助于后台线程。
但是,非常重要的一点是,您需要100%确保这仅在调试代码中,而不在分发代码中。因为什么都不会发布,所以您的应用程序将泄漏,泄漏和泄漏。为了提醒我执行此操作,我将此日志放在我的appdelegate中:
if(getenv(\"NSZombieEnabled\") || getenv(\"NSAutoreleaseFreedObjectCheckEnabled\"))
NSLog(@\"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!\");
, EXC_BAD_ACCESS是一个信号,指示您正在尝试访问已释放的内存或不存在的内存中的变量。由于它会在释放自动释放池之后显示,这意味着您可能过度释放了带有挂起的自动释放的变量,因此该变量在释放自动释放池时不再存在以释放。
有很多现有的问题可以解决这个问题,其中最重要的就是这个问题。
, EXC_BAD_ACCESS通常表示您的内存已释放过多。您可以在Xcode中使用\“ Build And Analyze \”命令来帮助跟踪。我还建议在整个代码中放置断点和日志记录语句,以隔离该错误。