0

私は、オブジェクトを保存するNSArrayとを数日間使用しています。を呼び出すと、配列からすべてのオブジェクトが削除されることに気付きました。私は代わりにオブジェクトを削除するためにこれを行ってきました:NSMutableArrayNSDate[listOfDates removeObject:date1]NSDate

  NSMutableArray *dateList; // Has Dates in it
  NSDate *dateToRemove;     // Date Object to Remove
  __block NSUInteger indexToRemove;
  __block BOOL       foundMatch = NO;
  [dateList enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if ([obj isEqualToDate:dateToRemove]) {
      indexToRemove = idx;
      foundMatch = YES;
      *stop = YES;
     }
  }];
  if (foundMatch) {
    [dateList removeObjectAtIndex:indexToRemove];
  }

これを行うためのより良い方法はありますか?おそらく別のデータ構造?それとももっと単純な関数ですか?

4

2 に答える 2

0

dateListのすべての日付が等しい場合、removeObject1つだけでなく、すべての日付が削除されます。1つだけを削除するには、短いバージョンでは最初のインデックスを取得してから、そのインデックスのオブジェクトを削除します。

NSUInteger indexToRemove = [dateList indexOfObject:dateToRemove];
if (indexToRemove != NSNotFound) {
    [dateList removeObjectAtIndex:indexToRemove];
}
于 2012-06-20T21:29:27.180 に答える
0

最初に試した方法を使用する必要があります。

[listOfDates removeObject:date1];

これにより、date1 と date1 のみが から削除されlistOfDatesます。listOfDatesのすべての NSDate オブジェクトが でない限り、これは からすべての NSDate オブジェクトlistOfDatesを削除しないでdate1ください。

removeObjectAtIndex: を indexOfObject: と組み合わせて使用​​して同じ効果を生成することもできますが、それは余分なコードです。

NSMutableArray クラス リファレンスからremoveObject:

このメソッドは、indexOfObject: を使用して一致を見つけ、removeObjectAtIndex: を使用してそれらを削除します。したがって、一致は isEqual: メッセージに対するオブジェクトの応答に基づいて決定されます。配列に anObject が含まれていない場合、メソッドは効果がありません (ただし、内容を検索するオーバーヘッドが発生します)。

于 2012-06-20T21:21:57.277 に答える