8

ドキュメントベースのアプリケーションがあり、必要なメソッドをサブクラス化NSDocumentして提供しましたが、ドキュメントを大規模にクリーンアップする必要があります(外部タスクを実行する必要があります)。これを置くのに最適な場所はどこですか?私は次のようないくつかの異なる方法を試しました:

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

に入れると、呼び出されることもあればdealloc呼び出されないこともあります(Command + Qを押すと、ドキュメントの割り当て解除がバイパスされるようです)が、このコードが失敗することなく呼び出されることが必須です(プログラムが予期せず終了しない限り)。

4

2 に答える 2

9

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

于 2009-03-16T04:58:21.230 に答える
8

ここでの正解は私のユースケースには合いませんでしたが、質問はそうです。したがって、余分な答えです。

私の使用例:ドキュメント (開いているドキュメントの 1 つかもしれません) を閉じますが、アプリケーションは閉じません。

この場合 (執筆時点で、私が間違った場所を探していない限り)、ドキュメントはそれほど役に立ちません。

canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo:NSDocument サブクラスにオーバーライドを追加し、その中で super を呼び出しました。ドキュメントには、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には、このメソッドに関する有益な議論がいくつかあります。このアプローチに欠点がある場合、またはこれを行うより良い方法がある場合は、コメントしてください。

于 2012-12-17T18:41:46.187 に答える