在加载我的可可应用程序期间,我的程序崩溃并显示 EXC_BAD_ACCESS 消息。堆栈跟踪没有帮助。关于如何找到问题的任何线索?
6 回答
当您尝试访问未正确保留的对象时,我曾见过这种情况发生的情况,因此它要么未指向对象的有效副本,要么指向另一种类型的对象。在 gdb 中使用 po 和 print 在启动过程中尽早放置断点并分析对象是您最好的选择。
这通常表示内存管理错误。
确保您的所有出口声明都遵循最佳实践:
@interface MyClass : MySuperclass {
UIClass *myOutlet;
}
@property (nonatomic, retain) IBOutlet UIClass *myOutlet;
@end
这种格式可确保您在具有任何超类的任何平台上获得正确的内存管理。
检查任何awakeFromNib
方法以确保您没有过度释放对象等。
旧线程的新答案...在 XCode 4 中,诊断 EXC_BAD_ACCESS 异常的最有效方法是使用 Instruments 来分析您的应用程序(从 XCode 单击 Product/Profile 并选择 Zombies)。这将帮助您识别发送到已释放对象的消息。
补充一点:解档失败的首要原因是忘记了“return self”;来自自定义类的 -init 。非常疼 :(
检查控制台日志(Applications/Utilities/Console.app)。当程序在启动时崩溃,并且初始化出现问题时,它通常会在崩溃之前在那里写出一些有用的错误消息。
这是可能的原因之一。有一个未初始化的 IBOutlet 对象,并且在 nil 上调用了一条消息。堆栈跟踪可能如下所示:
#0 0x90a594c7 in objc_msgSend
#1 0xbffff7b8 in ??
#2 0x932899d8 in loadNib
#3 0x932893d9 in +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:]
#4 0x9328903a in +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:]
#5 0x93288f7c in +[NSBundle(NSNibLoading) loadNibNamed:owner:]
#6 0x93288cc3 in NSApplicationMain
#7 0x00009f80 in main at main.mm:17
由于堆栈跟踪没有帮助,您将不得不逐步检查代码以查找错误。如果由于某种原因您无法在执行早期设置断点,请尝试插入一些 Debugger(); 将中断调试器的调用。