1

アプリケーションで、正しく破棄する必要がある別のスレッドがいくつかあります。ユーザーがファイル メニューで [終了] メニュー項目を選択した場合、終了する前に他の操作を停止してくださいというエラーが表示されます。ただし、ユーザーが Mac のアプリ ドックからアプリを終了すると、アプリは終了してクラッシュします。これは、他のスレッドが適切に破棄されずに自分のことを実行しようとしているからです。

試してみ-applicationShouldTerminate:ましたが、アプリのドック終了メソッドの場合はトリガーされません...ドキュメントが汚れている場合。ドキュメントがクリーンアップされた場合、つまり保存された場合、ダイアログが正しくポップアップします。

本当の問題は、ドキュメントがまだビジーであることがわかる前に、「ドキュメントを保存しますか」というクエリをどのように停止するかということだと思います。

ありがとう

4

2 に答える 2

8

-applicationShouldTerminate:NSApplication デリゲートで使用するのは正しいことです。

ただし、Mac OS X 10.6 以降で構築されたアプリケーションの場合、おそらく遭遇するであろう突然終了と呼ばれる機能があります。それはFoundation リリースノートでかなり簡単に説明されています。

結果として、バックグラウンド タスクは突然の終了を防ぐ必要があります。

- (void)longRunningTask {
    NSProcessInfo *processInfo = [NSProcessInfo processInfo];
    [processInfo disableSuddenTermination];

    // real task work

    [processInfo enableSuddenTermination];
}

このようにして、アプリケーションが-terminate:ビジー状態で終了するように要求すると、アプリケーションは適切に送信され、NSApplication デリゲートの が呼び出されます。-applicationShouldTerminate:これにより、タスクを正常に停止するか、ユーザーにキャンセルを求めることができます。

NSOperation またはそのサブクラスで長時間実行されるタスクを実行している場合は、このサポートをすべてのタスクに個別に追加するのではなく、一般的に追加することをお勧めします。(タスクが終了したかキャンセルされたかに関係なく、タスクがどのように停止しても、突然の終了を再度有効にすることを忘れないでください。)

于 2010-12-28T02:08:29.770 に答える
0

この以前の StackOverflow の投稿が役立つ場合があります。

アプリ終了イベント

[終了] メニュー項目が選択されたときに、既定のイベント ハンドラーをオーバーライドできます。

于 2010-12-28T02:08:59.113 に答える