1

iPhone初心者ですが、

私たちのチームはアプリを作成し、「AppStore」にアップロードしました。「Bug Sense」も統合しました。

現在、アプリはクラッシュのために否定的なレビューを受けています。iPhone/iPad 6.1.3 でアプリをテストしています。

私のバグの意味では、次のようなレポートが得られました。

最初のエラー:

-[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array [open]

2 番目のエラー:

-[__NSArrayM objectAtIndex:]: index 61 beyond bounds for empty array [open]

今私のプロジェクトでは、クラッシュを防ぐために@try{ } catch " " を使用するメソッドにブロックを配置しました。objectAtIndex

そして、条件も配置しました。つまり、配列カウントが「0」より大きい場合、それのみが「objectAtIndex」を使用する条件に入ります

私の質問は、を使用して上記のエラーのクラッシュを防ぐことができるかということ@try, catch mechanismです。

前もって感謝します

4

4 に答える 4

16

いいえ、 を使用@catchして例外から回復し、何も起こらなかったかのように実行を継続するべきではありません。

理由は 2 つあります。

まず、コードにバグがあります@catch例外をキャッチして無視するために使用しても修正されません。症状に対処しているだけですが、バグは残っています。

次に、フロー制御の例外 (回復可能なエラーの処理の例外) は、iOS/Cocoa プログラミングでは明示的にサポートされていません。システムへの呼び出しによって例外がスローされた場合、動作は未定義です。

詳細が必要な場合は、こちらの回答を参照してください: iPhone アプリでの NSException の使用

于 2013-06-06T16:56:00.973 に答える
2

Apple's Documentationには、まさに次の例があります。

[...] たとえば、NSArray の場合、特定のインデックスでオブジェクトにアクセスしようとする前に、常に配列のカウントをチェックしてアイテムの数を決定する必要があります。objectAtIndex: メソッドは、開発サイクルの早い段階でコードのバグを見つけることができるように、範囲外の要求を行うと例外をスローします。ユーザーに出荷するアプリで例外をスローすることは避ける必要があります。

于 2013-06-06T11:49:23.153 に答える
1

これは壊れない

if([array count]>n)
obj =[array objectAtIndex:n]
于 2013-06-06T11:59:40.777 に答える
0

NSArray を、1 つ (またはいくつかの同様の) メソッドを提供するカテゴリで拡張できます。

- (id) saveObjectAtIndex:(NSUInteger)n {
    return (n < [self count]) ? [self objectAtIndex:n] : nil;
}

または、そのためにマクロを使用します。これは、パフォーマンスの点でより優れたアプローチである可能性があります。

率直に言って、私は自分でそれをしたことはありません。なんで?私がそれをした場合、nilをチェックし、それに応じて反応しなければなりませんでした。したがって、最終的には、正の値 (インデックス変数が符号付きの場合) をチェックし、それを count プロパティと比較して、エラー状態に対応するのと同じ量の作業になります。心理的には、毎回自分でそれを行うことで、質の高いコードを書くことができ、エラー トレラント コーディングに対する意識が高まります。

于 2013-06-06T12:26:06.373 に答える