2012-06-20 7 views
0

Я работаю с NSArray и NSMutableArray s, которые хранят NSDate объектов за несколько дней. Я заметил, что вызов [listOfDates removeObject:date1] удаляет все объекты NSDate из массива. Вместо этого я удалял объекты:Как удалить объекты NSDate из NSMutableArray

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]; 
    } 

Есть ли лучший способ сделать это? Возможно, другая структура данных? Или более простая функция?

+0

Если у вас есть реальный объект из массива (по сравнению с копией), используйте 'removeObjectIdenticalTo: '. В противном случае 'removeObjectAtIndex:'. –

+0

Я прочитал его, Он гласит: «Таким образом, совпадения определяются на основе ответа объекта на isEqual: message'. Я думаю, что моя проблема - объекты NSDate. Реализация isEqual не смотрит на дату, хранящуюся в объекте. Поэтому мне интересно, есть ли другие решения, которые люди использовали. – Ryan

+0

Ваша проблема в том, что объекты NSDate DO реализуют isEqual, и у вас есть несколько одинаковых объектов NSDate в массиве. –

ответ

0

Вы должны использовать первый метод, который вы пробовали:

[listOfDates removeObject:date1]; 

Это удалит date1 и ТОЛЬКО date1 от listOfDates. Это НЕ должно удалять все объекты NSDate с listOfDates, если все объекты NSDate в listOfDates не являются date1.

Вы также можете использовать removeObjectAtIndex: в сочетании с indexOfObject: для продукта такого же эффекта, но это дополнительный код.

От NSMutableArray class reference для removeObject:

Этот метод использует indexOfObject: чтобы найти спички, а затем удаляет их с помощью removeObjectAtIndex :. Таким образом, совпадения определяются на основе ответа объекта на сообщение isEqual:. Если массив не содержит aObject, метод не имеет эффекта (хотя он несет накладные расходы на поиск содержимого).

0

Если все даты на dateList равны, removeObject не удаляет только один, но все они. Чтобы удалить только один, более короткий вариант, чтобы получить первый индекс, а затем удалить объект по этому индексу:

NSUInteger indexToRemove = [dateList indexOfObject:dateToRemove]; 
if (indexToRemove != NSNotFound) { 
    [dateList removeObjectAtIndex:indexToRemove]; 
} 
Смежные вопросы