2011-04-11 24 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,因爲如果我理解正確的話,任務會自動在你的應用程序太終止。此外,如果您支持突然終止,無論如何您的應用程序可能會在不通知/通知的情況下死亡。