2009-11-02 10 views
32

私は自分のCocoaアプリケーションに終了するための良い方法を探しています。これは実動コードには使用されませんのでご安心ください。私はちょうど1つのテストを実行し、デバッグ中にアプリケーションを閉じるための簡単な方法を探しています。Cocoaアプリケーションにアプリケーション自体から終了する方法を教えてください。

私はexit(0);がアプリケーションを終了することがわかりましたが、通常のアプリケーション終了手順をすべて迂回しています。すべてのアプリケーションを終了したいと思います。

基本的に、ユーザーがメニューから「Quit」を引っ張ったように機能するようにしたいが、テストを終えた後で自動的に実行したい。

私のコードは、現在、次のようになります。

#if (SUPERFANCY_TESTING_MODE) 
    [self doSomething]; 
    exit(0); // <-- I need something better to go here 
#endif 
+3

...もちろん、DoSomethingはdoSomethingでなければなりません.... – bbum

+1

Thanks、bbum。私はそれを変更しました。 –

答えて

82

あなたはかなりの残りの部分は、あなたのアプリが時間の少なくとも一部を殺さしようとしていることを保証することができます。したがって、exit(0);のような出口からの防御は、が必要です。

しかし、NSApplicationは-terminate:メソッドを実装しています。

[NSApp terminate: nil];あなたがしたいことをする必要があります。

私は一般的に、イベントループの次のパスの先頭で強制的に0.0の遅延で-performSelector:afterDelay:経由で投稿することを推奨します。

例:それがどのように見える

[NSApp performSelector:@selector(terminate:) withObject:nil afterDelay:0.0]; 
+0

これは完全に機能します。ありがとうございました! –

+31

(私のような)密であり、文法を正しく終わらせることができなかった人のために、完全な行は次のようになります。[NSApp performSelector:@selector(終了:) :) withObject:nil afterDelay :0.0]; – BarrettJ

+1

最近では、dispatch_asyncがこの問題を解決するうえでより良い方法になるでしょう。 –

2

[NSAppは終了します。id]廃止されました。 LSUIElementアプリのステータスバーメニューに終了メニュー項目を追加するとき、私は期待どおりに動作

[NSApp performSelector:@selector(terminate:) withObject:nil afterDelay:0.0]; 

:だから、@bbum状態として、これを使用します。

+10

'[NSApp terminate:]'は推奨されていません。オートコンプリートで表示される非推奨は、 'NSInputServiceProvider'の' terminate'メソッドから来ています。そして、もしそれが非難されるなら、あなたは 'performSelector :::'でそれを呼び出すべきではありません。 –

+0

ハ!良いキャッチ、ありがとう。 – Matt

関連する問題