2011-06-23 23 views
1

私は..予期しない動作:atIndex

NSMutableArray *numberOfdaysInAMonth = [[NSMutableArray alloc] init ] ; 

for (i=0; i< 30; i++){ 
    [numberOfdaysInAMonth addObject:[NSNumber numberWithInteger:i+1]]; 
    NSLog (@"Element_numberofDaysinAMonth %i = %@", i, [numberOfdaysInAMonth objectAtIndex: i]); 
} 

を使用して1〜30の数字を持つ配列を作ってみると、私は35個の要素を持つ配列を持っており、彼らがnullの値を持っています:

NSMutableArray *latestArrayForMonth = [[NSMutableArray alloc]init ]; 

for (i=0; i<36; i++){   
    [latestArrayForMonth addObject:[NSNull null]];   
} 

は、今私は、インデックスからLatestArrayWithMonth statrtingにnumberOfDaysInAMonthからの値を挿入する:1使用:

for (i = 0; i < 30; i++){ 
    [latestArrayForMonth insertObject:[numberOfdaysInAMonth objectAtIndex:i] atIndex:1]; 
    NSLog (@"Element_latestArrayForMonth %i = %@", i, [latestArrayForMonth objectAtIndex: i]); 
} 
コンソール上

出力は次のとおりです。

Element_latestArrayForMonth 0 = <null> 
Element_latestArrayForMonth 1 = 2 
Element_latestArrayForMonth 2 = 2 
Element_latestArrayForMonth 3 = 2 
Element_latestArrayForMonth 4 = 2 
Element_latestArrayForMonth 5 = 2 
. 
. 
. 
Element_latestArrayForMonth 28 = 2 
Element_latestArrayForMonth 29 = 2 

は、なぜ私は、出力のすべての2Sを取得していますか?

答えて

1

それがためにこの線のだ:

[latestArrayForMonth insertObject:[numberOfdaysInAMonth objectAtIndex:i] atIndex:1]; 

「I」変数がループに増加しているとして、あなたは、連続的項目atIndex:1を挿入しているので、配列内の項目数であるため - そう索引 'i'の項目のロギングは常に同じ項目です。

もインデックス1のオブジェクトを挿入すると、あなたがやりたいと思っているものであることを確認してください - のObjective-Cは、配列の最初の項目がインデックスであることを意味し、ゼロインデックス付き言語である0

ますlatestArrayForMonth配列内のすべてのオブジェクトを削除し、単にaddObjectメソッドを使用するか(addObjectsFromArrayを使用して、配列からすべての項目をすばやく追加する)ことをお勧めします。

「空の」値がいっぱいの配列を別の方法で調べる価値があるかもしれません。このアプローチのユースケースはまだ見たことがありません。空の配列。

もう一つ注目すべきことは、プリミティブな整数値を格納しているだけなので、NSIndexSetがNSArrayよりも適用可能であることがわかります(ポストされたコードのアプリケーションに依存しますが、調査する価値があります)。

0

insertObject:... atIndex:1を使用すると、インデックス1(要素がないためインデックス0になります)、月2(実際にはインデックス1)が挿入され、2の前に挿入されます。この1,5,4,3,2のように。あなたがすべきことは、インデックスから1を引いて配列にアクセスするだけですが、インデックス1からアクセスする場合は、最初にNSNullを追加してください。

[latestArrayForMonth addObject:[NSNull null]]; 

for (i = 0; i < 30; i++){ 

    [latestArrayForMonth addObject:[numberOfdaysInAMonth objectAtIndex:i]]; 

    NSLog (@"Element_latestArrayForMonth %d = %@", i + 1, [latestArrayForMonth objectAtIndex: i + 1]); 

} 
関連する問題