为什么我的 cocoa 程序在启动期间获得 EXC_BAD_ACCESS?
-
09-06-2019 - |
题
在加载我的 cocoa 应用程序期间,我的程序崩溃并显示消息 EXC_BAD_ACCESS。堆栈跟踪没有帮助。有什么线索可以告诉我如何找到问题吗?
解决方案
我见过很多次,当您尝试访问未正确保留的对象时,可能会发生这种情况,因此它要么没有指向对象的有效副本,要么指向其他类型的对象。尽早放置断点并在 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)。这将帮助您识别发送到已释放对象的消息。
加上:不合时宜的失败的最大原因是忘记“回归自我”;来自自定义类的 -非常疼 :(
检查控制台日志(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();将中断调试器的调用。
不隶属于 StackOverflow