2011-04-11 41 views
3

我有一个基于文档的Cocoa应用程序,它的子类NSDocument作为MyDocument。每个MyDocument管理一个单独的后台进程(作为NSTask)。我想确保NSTask在其相应的MyDocument关闭时或整个应用程序退出时终止。NSDocument子类,称为“关闭”方法两次

对于后者,我使文档观察NSApplicationWillTerminateNotification.对于前者,我重写close方法:

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

(顺便说一句,我不能把清理代码在dealloc方法,因为该项目是GC 。“d)

问题是这样的:如果我打开一个MyDocument,使未保存的更改,然后按CMD-Q中,close方法被称为两次。从调试器,调用链是: [MyDocument close]电话[NSDocument close],这就要求[NSWindowController _windowDidClose],再次呼吁[MyDocument close]。 (在该通话之后,应用程序退出)。

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

+1

有趣。这种行为(不止一次接收'-close')似乎没有记录。我认为你建议让'-close'安全地运行多次是很好的选择。 – 2011-04-12 05:00:05

+0

其实,你不是第一个想到的是:http://www.cocoabuilder.com/archive/cocoa/240166-nsdocument-close-method-calls-itself.html – 2011-04-12 05:12:09

回答

1

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

我不相信你需要关心NSApplicationWillTerminateNotification,因为如果我理解正确的话,任务会自动在你的应用程序太终止。此外,如果您支持突然终止,无论如何您的应用程序可能会在不通知/通知的情况下死亡。