Objective-C странная ошибка SIGABRT - PullRequest
0 голосов
/ 20 февраля 2012

Я изучаю Objecive-C и пытаюсь удалить методObject в цикле.Это не работает правильно.Я получаю "Тема 1: Программа получила сигнал:" 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]];
}

PS xCode 4.1

Ответы [ 3 ]

2 голосов
/ 20 февраля 2012

Проблема в том, что вы удаляете предметы в неправильном порядке. После удаления элемента с индексом 0 все индексы уменьшаются на единицу. Так что вы можете сделать это:

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)

1 голос
/ 20 февраля 2012

Я вижу довольно много вещей, которые могут быть неправильными в вашем коде, но вещь, которая выглядит хуже: вы удаляете объекты в массиве, начиная с индекса 0, вплоть до счетчика.Это будет означать, что i = 0,1,2,3, в то время как массив продолжает сдвигать элементы обратно в позицию 0. Это, безусловно, вызовет исключение, и только половина массива может быть очищена таким образом.

Альтернатива: используйте метод, который очищает массив ([bookListMutable removeAllObjects]), или переберите счетчик до 0.

0 голосов
/ 20 февраля 2012

Вы не должны удалять предметы в этом порядке.Допустим, массив состоит из 4 элементов {0, 1, 2, 3} и имитирует выполнение программы:

  1. Первая итерация с y = 0: удаление элемента по индексу 0 из {0, 1, 2, 3} дает {1, 2, 3}.

  2. Вторая итерация с y = 1: удаление элемента по индексу 1 из {1, 2, 3} дает {1, 3}

  3. Третийитерация с y = 2: удаление элемента с индексом 2 из {1, 3} дает.К сожалению, нет элемента с индексом 2 => Исключение.

Так что вы должны выполнить итерацию в обратном направлении, как это:

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

или использовать метод build in:

[bookListMutable removeAllObjects];
...