0

アプリを実行すると、このコードでは、配列から要素を削除しようとするとエラーが発生します。なぜこのエラーがあるのですか?そして、この問題を解決するにはどうすればよいですか?

  if ([EnterWeightViewController withData]) {

    Database *db = [[Database alloc] init];
    [db openDB];
    [db createTable];
    NSArray *array = [db getAllPesi];
    int count = [self.weightHistory countOfWeightHistory]; //count = 5
    NSLog(@"Count of Array = %i", count);

    //-- Init Array
    for (int i =0; i< count; i ++) { 
        [self.weightHistory removeWeightAtIndex:i]; //error when i > 2
    }

    //-- Load Array
    for (WeightEntry *entry in array) {
        [self.weightHistory addWeight:entry];
    }

    //-- Reload Data
    [self.tableView reloadData];
}

 - (void)removeWeightAtIndex:(NSUInteger)weightIndex;{

  // Manually send KVO messages.
  [self willChange:NSKeyValueChangeRemoval 
   valuesAtIndexes:[NSIndexSet indexSetWithIndex:weightIndex]
          forKey:KVOWeightChangeKey];

  // Add to the front of the list.
  [self.weightHistory removeObjectAtIndex:weightIndex];

  // Manually send KVO messages.
  [self didChange:NSKeyValueChangeRemoval 
valuesAtIndexes:[NSIndexSet indexSetWithIndex:weightIndex]
         forKey:KVOWeightChangeKey];

}

エラーメッセージ:*キャッチされなかった例外'NSRangeException'が原因でアプリを終了しています。理由:'* -[__ NSArrayM removeObjectAtIndex:]:インデックス3が境界を超えています[0 .. 1]' *最初のスロー呼び出しスタック:(0x19ba012 0x1397e7e 0x195c1c4 0x9618 0x5622 0x3c2753 0x3c2a 0x3d0590 0x3d85bd 0x3d8eab 0x3da3d6 0x3da675 0x96fd780 0x3d9625 0x3db728 0x35da0b 0x35d990 0x96d1f7a 0x360d1a 0x360f14 0x3610c9 0x31233f 0x312552 0x2f03aa 0x2e1cf8 0x26ecdf9 0x26ecad0 0x192fbf5 0x192f962 0x1960bb6 0x195ff44 0x195fe1b 0x26eb7e3 0x26eb668 0x2df65c 0x2b2d 0x2a55)のlibc ++ abi.dylib:例外をスロー呼ばTERMINATE

4

2 に答える 2

2

が3に等しい場合i、配列から3つのアイテム(0、1、2)が既に削除されています。これで、位置0と1に2つ残っています。位置3で1つを削除しようとすると、範囲外になります。

removeAllObjectsループを通過する代わりに、配列を呼び出します。

于 2012-10-26T11:14:22.557 に答える
0

このようなコード行は悪い考えです:

for (int i =0; i< count; i ++) { 
        [self.weightHistory removeWeightAtIndex:i]; //error when i > 2
    }

あなたがしているのは、配列を列挙している間に配列を変更することです。配列を処理しながら変更すると、問題が発生する可能性があります。

于 2012-12-04T20:59:59.937 に答える