質問

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

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

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

役に立ちましたか?

解決

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

他のヒント

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

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

この場合(執筆時点で、間違った場所を探している場合を除き)ドキュメントはそれほど有用ではありません。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top