我遇到EXC_BAD_ACCESS
错误。我在xCode 4中使用了 Profile 来查看内存发生了什么,并看到它是僵尸事件:
An Objective-C message was sent to a deallocated object(zombie) at address ...
我在对象列表中找到了提到的地址。负责任的来电者
-[NSWindowTemplate nibInstantiate]
Zombie Responsible Caller - [NSApplication(NSWindowCache) _checkForTerminateAfterLastWindowClosed: saveWindows:]
在zombie活动之前,有[NSWindow _close]
,[NSWindow retain]
和几个[NSWindow release]
个事件(最后[NSWindow release]
后参考次数= 0)
EXC_BAD_ACCESS
。我评论了所有代码,因此在启动应用程序后没有执行任何操作。我启动它并立即关闭 - 并且错误触发。
为什么要_checkForTerminateAfterLastWindowClosed
启动,如何阻止EXC_BAD_ACCESS
?有什么想法吗?
由于
答案 0 :(得分:2)
我们可以安全地假设调用_checkForTerminateAfterLastWindowClosed
来检查应用程序是否应该在其最后一个窗口关闭后终止。我们可以进一步假设它是通过asking your application delegate来完成的。
我刚在your previous question注意到您的窗口是您的应用程序代理。所以我猜测:
关闭应用程序时会发生
EXC_BAD_ACCESS
。
你的意思是当你关闭窗口时会发生这种情况。 (一个应用程序无法关闭;该动词不会与该名词一起使用。您关闭窗口并退出或终止应用程序。)
当您关闭窗口时(假设它是您唯一的窗口),应用程序会询问其代理是否应该退出该窗口。不幸的是,您设置为其委托的对象是您刚关闭的窗口,因此被终止。
这就是被传递的死对象(乐器会证实这一点):你的窗口,也是你的应用程序的代表。
最好的解决方案是将对象拆分为两个(或三个):创建NSObject的直接子类,并将其实例作为您的应用程序的委托,并创建并拥有一个窗口控制器,加载窗口。