2009-03-16 2 views
8

私は文書ベースのアプリケーションを持っており、サブクラスはNSDocumentであり、必要なメソッドを提供していますが、私の文書には大規模なクリーンアップ(外部タスクの実行など)が必要です。これを置くのに最適な場所はどこですか?私はdeallocに入れた場合、それは時々、それが呼び出されると、他の回、NSDocumentサブクラスのクリーンアップコードはどこにありますか?

  • close
  • close:
  • canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo
  • dealloc

:私は、次のようないくつかの異なる方法を試してみました(Command + Qを押すとドキュメントの割り当て解除をバイパスするように見える)が、このコードはfaiなしで呼び出されることが必須ですルアー(プログラムが突然終了しない限り)

答えて

8

各文書をNSApplicationWillTerminateNotificationのローカル通知センターにオブザーバとして追加してください。通知方法では、クリーンアップメソッド(deallocまたはcloseからも呼び出す必要があります)を呼び出します。

8

ここの正解は私の使用例に適合しませんでしたが、質問はします。したがって余分な答え。

私の使用例:文書を閉じる(いくつかは開いているかもしれませんが、アプリケーションを閉じないでください)。

この場合(私が間違った場所を探しているのでなければ)、documentationはそれほど有用ではありません。

NSDocumentサブクラスでcanCloseDocumentWithDelegate:shouldCloseSelector:contextInfo:オーバーライドを追加し、その中にスーパーを追加しました。このドキュメントでは、superを呼び出す必要があるかどうかは分かりませんが、システムによってセレクタとコンテキストが提供されていることがわかります。このメソッドは、ドキュメントが閉じられる直前に呼び出されます。

- (void) canCloseDocumentWithDelegate:(id)delegate shouldCloseSelector:(SEL)shouldCloseSelector contextInfo:(void *)contextInfo; 
{ 
    if ([self pdfController]) 
    { 
     [[[self pdfController] window] close]; 
     [self setPdfController: nil]; 
    } 

    [super canCloseDocumentWithDelegate:delegate shouldCloseSelector: shouldCloseSelector contextInfo: contextInfo];  
} 

CocoaBuilderには、この方法の有用な説明があります。このアプローチの欠点やこれを改善する方法がある場合は、コメントしてください。

+2

私はshouldCloseSelectorでクリーンアップを行うべきです。なぜなら、ドキュメントが閉じられる準備が整った(例えば、正常に保存された)場合にのみshouldCloseSelectorが呼び出されるからです。このcanCloseメソッドが呼び出されても、ドキュメントが実際に閉じられることは示されません(たとえば、保存が失敗する可能性があります)。 – Joel

関連する問題