3

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

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

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

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

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

这是预期的行为吗?如果是这样,是否有更好的方法来释放特定于文档的资源?还是我应该确保close安全运行多次?

4

1 回答 1

1

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

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

于 2013-04-09T08:26:30.347 回答