2

実行する単純なコードがあり、クラッシュした場合に備えて、アプリがクラッシュしないように例外をキャッチしたいと考えています。

@try {
    x = [self try_doMyWork:Param];
} @catch (NSException* e) {
    NSLog(@"Exception");
}

このコードはデバッグで機能し、例外 (配列の末尾を超える単純なインデックス) をキャッチしますが、iPhone 上の分散アプリでクラッシュします。

これはなぜですか? また、分散アプリでも確実に機能するようにするにはどうすればよいですか?

4

2 に答える 2

2

キャッチされないアプリケーション レベルの例外は、クラッシュの原因の 1 つにすぎません。EXC_BAD_ACCESS などの BSD シグナルもクラッシュを引き起こす可能性があり、NSExceptions をキャッチしてもそれらを防ぐことはできません。

try_doMyWork: の詳細を知らずに特定のクラッシュが何であるかを言うことは不可能ですが、C レイヤー (Objective-C レイヤーではない) でのクラッシュの最も一般的な原因は、メモリ管理の問題であると思います。あなたのアプリはアクセスすることは想定されていません。最も可能性の高い説明は、デバッグで表示される例外がディストリビューションで表示されるエラーと同じではないということです。

于 2013-03-30T03:04:59.227 に答える
2

デバッグ モードでは、ヒープ マネージャーはオブジェクトの前後にバッファー ゾーン (ガードと呼ばれる) を割り当て、それらのガードを既知の値 (0x7F など) で埋めることができます。これは、メモリを解放するときにこれらのガードをテストし、割り当てられたメモリの終わりを超えて (または開始前に) 書き込みを行ったかどうかを判断できるようにするためです。このようにして、コードにバグ (メモリ スクリブラー) があることを知らせることができます。

リリース モードでは、これらのガードは作成されないため、割り当てられたメモリの外部に書き込むと、問題 (クラッシュなど) が発生します。

于 2013-03-30T03:02:56.600 に答える