2012-02-19 5 views
-1

私はObjecive-Cを学び、ループ内のObjectメソッドを試そうとしています。 正しく動作しません。私は "スレッド1:プログラム受信信号:" SIGABRT "を受け取ります。"その行に どうしたのですか?Objective-C strange error SIGABRT

NSMutableArray *bookListMutable = [NSMutableArray arrayWithObjects:@"TitleM 2", @"TitleM 4", @"TitleM 5", nil]; 
[bookListMutable addObject:@"TitleM 3 added"]; 
[bookListMutable insertObject:@"TitleM 1 inserted" atIndex:0]; 

long countMutable; 
countMutable = bookListMutable.count; 


for(int y = 0; y < countMutable; y++){ 
    [bookListMutable removeObject:[bookListMutable objectAtIndex:y]]; 
} 

P.S. xCode 4.1

+1

1)を更新する時間、Xcodeの4.3があります。 2)SIGABRTは通常例外です。あなたはコンソールをチェックしましたか? –

+0

これはどのラインですか?また、なぜあなたは 'removeObjectAtIndex:'を使っていないのですか、それとも 'removeAllObjects'ですか? –

+0

私はこの本から運動を試みました。http://www.amazon.com/Objective-C-Absolute-Beginners-iPhone-Programming/dp/1430228326/ref=sr_1_2?ie=UTF8&qid=1329685777&sr=8-2 –

答えて

0

にカウントからダウン繰り返します。 y = 0

  1. 最初の反復::さんが配列の4つの項目{0, 1, 2, 3}とプログラムの実行をシミュレートを持っているとしましょう{0, 1, 2, 3}からインデックス0にある項目を削除すると{1, 2, 3}を与えます。 y = 1

  2. 2回目の反復:{1, 2, 3}からインデックス1にある項目を削除するには、y = 2{1, 3}

  3. 3回目の繰り返しを与える:{1, 3}からインデックス2にある項目を削除することはできます。インデックス2 =>例外にはアイテムがありません。

    for(int y = countMutable-1; y >= 0; y--) { 
        [bookListMutable removeAtIndex:y]]; 
    } 
    

    かの方法でビルドを使用します:

ですから、このように逆方向に反復する必要があります

[bookListMutable removeAllObjects]; 
+0

非常に明確な説明をありがとうございます=) –

2

問題は間違った順序でアイテムを削除してしまうことです。索引0の項目を削除すると、すべての索引が1つ減少します。

for(int y = countMutable-1; y >= 0; y--) { 
    [bookListMutable removeObject:[bookListMutable objectAtIndex:y]]; 
} 

またはこの:

for(int y = 0; y < countMutable; y++) { 
    [bookListMutable removeObject:[bookListMutable objectAtIndex:0]]; 
} 

(私はあなたのコードにマイナーな変更としてこれを残しているが、物事を行うには良い方法があることに注意したいと思いますので、あなたはこれを行う可能性がありますremoveObjectAtIndex:を使用してください。https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.htmlを参照してください)

+0

ありがとうあなた、今それは動作します。 –

1

コードでは間違っている可能性がありますが、最悪の場合はインデックス0から始まる配列のオブジェクトを削除していますカウントに行く。これはi = 0,1,2,3を意味しますが、配列は要素を0の位置に戻し続けますが、これは間違いなく例外をスローし、配列の半分だけがこの方法で消去できます。

オルタナティブ:配列([bookListMutable removeAllObjects])をクリアする方法を使用するか、またはあなたがその順序で項目を削除しないでください0