2011-07-02 14 views
3

私は、ココアプログラムが終了するバグを作成することができました。Cocoaプログラムはクラッシュなしで終了します

- [NSApplication terminate:]は明らかに呼び出されません。

- [NSException init]はありません。

クラッシュはありません。私がgdbで見ているのは、exit()が通常の[NSApplication terminate]パスを経由せずにNSApplicationMainから直接呼び出されているということです。

これをデバッグする方法、および/またはこれ(一見「不可能な」動作)がどのように起こるかについてのアイデアはありますか?

あらかじめココアの新聞に感謝します。

+0

'出口?誰が 'exit'と呼んでいますか? –

+0

exit()がNSApplicationMainから直接呼び出されています。 – zer0gravitas

答えて

0

これを詳しく調べてみると、私は大きな写真の中で何か間違っていると思いました。それで、 "全体像の中で"、私がやっていたことはモーダルダイアログを呼び出すことです(ウインドウを表示してから[NSApplication beginModalSessionForWindow] ... [NSApp runModalSession]を使う...) endModalSession]。これは、コードの他のチャンク大したことないで私のために働いています。重要な違いこのモーダルウィンドウがロードされ、別のクラスのawakeFromNibが不足していたということでした。

は私が再現されますシンプルなアプリを書きましたこれはモーダルダイアログがうまく読み込まれ、モーダルウィンドウを閉じると閉じるだけでなく、アプリケーションが終了するだけでなく、これは「設計通り」の動作であると想像しています。 apple docsなぜそれがそうだったのか理解できれば、私はそれについて混乱しています。私は何とか私のダイアログのモーダルeを推測します通気ループがアプリのイベントループをハイジャックしているので、ダイアログが終了したときにアプリが実行されます。

誰もがこの間違いのより良い理解を持っている場合は、私たちを啓発すること自由に感じなさい...読書や提案のためのすべての

感謝。

4

私はブレークポイントを適切に使い始めるでしょう。フォールスクラッシュ前にコードが表示されている最後の場所まで絞り込み、その領域の周りを見てメモリの問題を調べます。私が本当に奇妙な動作をするたびに、それはほぼ完全に奇妙なメモリバグが原因です。

2

通常の[NSApplication terminate]パスを経由せずにアプリケーションが自発的に終了するルートはほとんどありません。

"stop:"にブレークポイントを設定してみてください。私は何とか、おそらく不適切な名前のperformSelector呼び出しを疑う?または悪い名前のIB接続では、このメソッドを呼び出しています。このメソッドは、メインイベントループから終了するように文書化されています。

+0

関連ドキュメント:http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/NSApplication/stop:アプリケーションに直接送信する必要はありません。 IB内でそれを接続するか、UI要素の動作を設定してターゲットを設定しないで、最初のレスポンダに送信することもできます。 –

+0

[NSApplication stop:]で中断しましたが、そこにも喜びはありませんでした。これを悩ませた後、私は "大きな絵で"間違ったことをしていたと推測しました... – zer0gravitas

0

PS - モーダルセッションコールの代わりに[NSApplication runModalForWindow:]を使用するようにコードを変更しました。すべてがうまくいきました。 (モーダルセッションを使用するとモーダルダイアログからWebブラウザを起動できますが、runModalForWindowはそうしませんが、この場合はその機能は必要ありません)

関連する問題