2012-03-09 15 views
1

...高速列挙ARCを使用して

NSArray *array = [NSArray arrayWithObjects:@"dog", @"cat", @"mouse", nil]; 

for(NSString *animal in array) { 
    NSLog(@"animal = %@", animal); 
} 

は、境界エラーのうち、インデックスを生成します。

*** - [__ NSArrayM objectAtIndex:]:空の配列

の境界を越えてインデックス0は、私は間抜けな何かミスを犯してきましたか?

+1

私はあなたのコードをテストし、期待どおりに動作します。これはあなたの実際のコードですか?または、コード内のある場所で配列を初期化し、別の場所でそれをループしますか? – sch

+0

一つの可能​​性は、あなたが "配列"への割り当てとそれを別の場所で使用していることです。したがって、「配列」は概念的に範囲外になり、参照しようとする前にGCedされました。私はARCにはまだどのようなシナリオが起こっているのか知るにはまだ十分に精通していませんが、束があると確信しています。 –

答えて

1

あなたが表示したコードは問題ありません。私はARCの下でそれを実行し、正常に完了しました。エラーがそのコードであり、コードの別の部分ではないと確信していますか?

変数「array」はかなり一般的です。それは他のローカル/インスタンス変数と干渉していますか?コードが互いに隣り合っているかどうかは関係ありませんが、ある場所で宣言して別のループでforループを実行している場合は、同じ「配列」を実行していない可能性があります。このコードを別のクラス/メソッド/に置き換え、どのように動作するかを見てください。

もう1つの考え方:Fast Enumerationは長さがゼロの配列を列挙しません(最初にチェックします)。これが、間違ったコード行について間違いを誤っていると思う理由です。

+0

もちろん、これは私の生産コードではありません...私は問題が文字列リテラルにあると思っていたので、上記の例に絞って説明しました。実際の問題はfor-inループの中にありました。文字列ではなく配列を引数として期待するメソッドを呼び出していました。だから間違いは骨が折れていた。 (もっとコーヒーを見つけなければならない!) – edelaney05

+0

ええ、私は時々それをする。コードを削除し、エラーが出るまでピース単位で追加し直してください。うまくいくと思う。 –

関連する問題