NSDocument子类“close”方法调用两次

时间:2011-04-11 20:37:52

标签: cocoa nsdocument

我有一个基于文档的Cocoa应用程序,它将NSDocument作为MyDocument的子类。每个MyDocument管理一个单独的后台进程(作为NSTask)。我希望确保NSTask在相应的MyDocument关闭或整个应用程序退出时终止。

对于后者,我让文档观察NSApplicationWillTerminateNotification.对于前者,我覆盖了close方法:

-(void)close {
    // Cleanup code here
    [super close];
}

(顺便说一句,我不能在dealloc方法中放入清理代码,因为项目是GC的。)

问题是:如果我打开MyDocument,进行未保存的更改,然后按cmd-Q,close方法将被称为两次。从调试器,调用链是: [MyDocument close]调用[NSDocument close],调用[NSWindowController _windowDidClose],再次调用[MyDocument close]。 (在该调用之后,应用程序退出)。

这是预期的行为吗?如果是这样,是否有更好的方法来发布特定于文档的资源?或者我应该让close安全地运行多次?

1 个答案:

答案 0 :(得分:1)

我相信我已经看到cocoadev邮件列表中的帖子说这是目前框架的正常行为(但未来可能会发生变化)。您应该使-close方法足够强大以处理多个调用,因为AppKit不保证它只会被调用一次。

我不相信您需要关注NSApplicationWillTerminateNotification,因为如果我理解正确,当您的应用也是如此时,任务会自动终止。此外,如果您支持突然终止,您的应用程序可能会在没有通知/通知的情况下被杀死。