Cocoa アプリケーションにカスタムの終了動作を実装しようとしています。通常、アプリケーションが正常に終了すると、実行時のデータベースの最終クリーンアップが実行されてから終了します。これは、が呼び出されるNSApplication
たびに AppDelegate ( のデリゲート) 内で発生します。[NSApp terminate:aSender]
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
// database cleanup...
return NSTerminateNow;
}
実行時にエラーが発生した場合 (データベース ファイルが削除された場合など)、ユーザーにエラーを提示し、回復 (ファイルを元に戻して再試行) または終了するオプションを提供します。[終了] が選択されている場合は、データベースのクリーンアップをすべてスキップしてアプリを終了します。これは不可能になったためです。本質的に、私はこのようなものが欲しいです:
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
BOOL gracefulTermination = ...;
if (gracefulTermination == YES)
{
// Database cleanup....
}
return NSTerminateNow;
}
もちろん、問題は gracefulTermination の値を取得することです。
infoDict などの呼び出されNSApp
たときにカスタム変数を渡し、内部で受け取る方法はありますか?terminate:
applicationShouldTerminate:
そうでない場合、カスタムの終了動作を実現するためのより良い方法はありますか?
私の知る限り、terminate:
が他のオブジェクトから呼び出されると、次のようになります。
[NSApp terminate:self];
foo (別名self )によって呼び出されます。- NSApp はデリゲートを送信します:
[aDelegate applicationShouldTerminate:self];
( selfはfooではなく NSApp です)。 - aDelegate はメッセージを受け取り、
applicationShouldTerminate:
実装されている場合は実行します。
fooはどこかに消えたように見え、aDelegateがメッセージを受け取るまでに、それは完全になくなり、送信者としてのみNSApp
表示されます。これにより、カスタム動作を含む aDelegate に foo 内の infoDict や単なる infoDict を渡すことができなくなりterminate:
ます。
[NSApp terminate:...]
のようなものを使用せずに終了できることは承知していexit()
ます。私が読んだところによると、これはココアのコーシャではないため、眉をひそめています. さらに、他のクリーンアップ操作が内部applicationShouldTerminate:
で発生するのを防ぐことにもなります。