我有一个基于文档的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
安全地运行多次?
答案 0 :(得分:1)
我相信我已经看到cocoadev邮件列表中的帖子说这是目前框架的正常行为(但未来可能会发生变化)。您应该使-close
方法足够强大以处理多个调用,因为AppKit不保证它只会被调用一次。
我不相信您需要关注NSApplicationWillTerminateNotification
,因为如果我理解正确,当您的应用也是如此时,任务会自动终止。此外,如果您支持突然终止,您的应用程序可能会在没有通知/通知的情况下被杀死。