可可的僵尸事件

时间:2011-12-04 18:55:05

标签: macos cocoa xcode4 exc-bad-access dealloc

我遇到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?有什么想法吗?

由于

1 个答案:

答案 0 :(得分:2)

我们可以安全地假设调用_checkForTerminateAfterLastWindowClosed来检查应用程序是否应该在其最后一个窗口关闭后终止。我们可以进一步假设它是通过asking your application delegate来完成的。

我刚在your previous question注意到您的窗口是您的应用程序代理。所以我猜测:

  关闭应用程序时会发生

EXC_BAD_ACCESS

你的意思是当你关闭窗口时会发生这种情况。 (一个应用程序无法关闭;该动词不会与该名词一起使用。您关闭窗口并退出或终止应用程序。)

当您关闭窗口时(假设它是您唯一的窗口),应用程序会询问其代理是否应该退出该窗口。不幸的是,您设置为其委托的对象是您刚关闭的窗口,因此被终止。

这就是被传递的死对象(乐器会证实这一点):你的窗口,也是你的应用程序的代表。

最好的解决方案是将对象拆分为两个(或三个):创建NSObject的直接子类,并将其实例作为您的应用程序的委托,并创建并拥有一个窗口控制器,加载窗口。