NSDocumentサブクラスのクリーンアップコードはどこに配置しますか?
-
19-08-2019 - |
質問
ドキュメントベースのアプリケーションがあり、サブクラス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 に、このメソッドの有用な議論があります。このアプローチに欠点がある場合、またはこれを行うより良い方法がある場合は、コメントしてください。