こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

objective-cで終了時に処理

お世話になっております。

objective-cでMacOS用のデーモンアプリを作成しております。
シャットダウン時に処理を行いたいのですが、
「applicationShouldTerminate」や「applicationWillTerminate」に処理を記述しても実行されません。
アプリが終了する際に呼び出されると思ったのですが、検証の結果からWindowが無い場合は上記のどちらも実行されないと予測されます。
同じコードでWindowを表示させるようにしてダブルクリックで起動した場合、アプリ終了時には実行されます。

最後のWindowが閉じられた際に「applicationShouldTerminate」が呼び出され「NSTerminateNow」で「applicationWillTerminate」が処理されると思われます。

Windowの有無に関わらず、アプリ終了時に動作する方法、もしくはシャットダウンを検知する方法をご存知の方が居られましたらご教授をお願いします。

お手数をお掛け致しますがよろしくお願いいたします。

投稿日時 - 2014-12-10 15:42:41

QNo.8853635

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

> 「applicationShouldTerminate」や「applicationWillTerminate」

これらのメソッドは、どこに記述していますか?
これらはDeldegateメソッドだということは、ごぞんじですね?Delegateメソッドを記述したクラスのインスタンスが、アプリケーション終了まで、解放されないという保証はありません。というより、解放されない保証を、プログラマが行わなければいけません。
どうやら、ウインドウを閉じると、Delegateメソッドを記述したクラスのインスタンスが、そのタイミングで解放されるような、アプリケーションの構成になっているように見受けられます。Delegateメソッドの送り先が、解放されたあとでは、実行されるはずがありません。
この点を、ご確認ください。

投稿日時 - 2014-12-10 17:20:46

補足

ご回答ありがとうございます。

Objective-cはよく分からず作成しているのでDeldegateメソッドについても、なんとなく分かっていますが正しいかは自信が有りません。

投稿後、いろいろ検証しましたが、
実行ファイルをダブルクリックで起動した場合、Dockから強制終了でのアプリ終了時には想定した処理が実行されます。
同じ実行ファイルをデーモンとして起動した場合、Dockからの強制終了が出来ず(おそらくRoot権限が無いから)、シャットダウンしてもシャットダウンされず、ターミナルからデーモンを止めなければならない状態になりました。

「applicationShouldTerminate」と「applicationWillTerminate」は「AppDelegete.m」内に記述しております。
たまたま検索して見つけて、ダブルクリックで動いたのでデーモンでも動くことを期待しただけなので、これを使うことにこだわりは有りません。
アプリの終了を検知して動く、もしくはシャットダウンシグナルを受けて動く、ようにしたいと思っております。

投稿日時 - 2014-12-10 19:44:22

あなたにオススメの質問