2012-02-07 3 views
0

У меня есть NSMutableArray с пятью объектами. Я хочу удалить два объекта, когда выполняется определенное условие. Но это дает мне ошибку ----- * Завершение приложения из-за неотображенного исключения «NSRangeException», причина: '* - [NSMutableArray objectAtIndex:]: индекс 3 за пределами границ [0 .. 2]' мой кодУдаление двух объектов из nsmutablearray

-(IBAction)buttonPressed1:(id)sender{ 
for (int i = 0; i < [objectArray1 count]; i++) { 

    if ([[objectArray1 objectAtIndex:3] isEqualToString:@"xyz"]) 
    { 

     NSMutableIndexSet *indexes = [NSMutableIndexSet indexSetWithIndex:3]; 
     [indexes addIndex:4]; 
     [objectArray1 removeObjectsAtIndexes:indexes]; 
     NSLog(@"Hello %@",objectArray1); 
    } 
} 

ЕСЛИ Я удаляю условие {}, он работает нормально. Любая помощь будет оценена.

+1

ваш массив не содержит достаточного количества объектов, почему вы задаетесь вопросом, почему вы получаете аварии? проблема в том, что вы ожидали 5 объектов, и они не все в массиве в то время, когда вы хотите их удалить. –

+0

мой массив содержит пять объектов. – NoviceDeveloper

ответ

4

Если вы хотите удалить объекты по индексам 3 и 4, как вы, кажется, здесь, то не делайте этого внутри цикла. Вы берете свой массив из 5 объектов и удаляете последние 2 объекта в нем в первый раз через цикл, оставив вам 3 объекта в вашем массиве. В следующий раз через ваш цикл вы выполняете ту же проверку элемента в индексе массива 3, и массив больше не имеет этого индекса, потому что вы его удалили.

+0

Спасибо @Tim ,, пропустил логику .. :) – NoviceDeveloper

0

Кажется, вы проходите цикл 4 раза.
Если условие истинно, условный код будет выполнен 4 раза.
Создайте индекс 4.
Вы удаляете его.
Во второй раз, когда вы его удаляете, вы получаете сбой.

Если я правильно то, что вы хотите сделать, понял, что это код:

if ([[objectArray1 objectAtIndex:3] isEqualToString:@"xyz"] && 
    objectArray1.count == 5) { 
    NSMutableIndexSet *indexes = [NSMutableIndexSet indexSetWithIndex:3]; 
    [indexes addIndex:4]; 
    [objectArray1 removeObjectsAtIndexes:indexes]; 
    //less code: 
    //[objectArray1 removeLastObject]; 
    //[objectArray1 removeLastObject];  
}