Если исключить другие проблемы, упомянутые всеми остальными, давайте сосредоточимся на том, почему вы получаете за пределами допустимой ошибки.
Вот соответствующий код.
for (int j = 0; j < QuestionCount - 1; j++)
{
NSString *SelectedQuestion = [self.QuestionsByLevel objectAtIndex:j];
// ... snip ...
if (level != GameLevel) //Always happening in your current code
[QuestionsByLevel removeObjectAtIndex:j];
}
Посмотрим, что произойдет после нескольких итераций этого кода.
Первая итерация:
j == 0
self.QuestionsByLevel == [Q1, Q2, Q3, Q4, Q5]
SelectedQuestion = QuestionsByLevel[0] // Q1
// The following happens because you call removeObjectAtIndex:0
QuestionsByLevel = [Q2, Q3, Q4, Q5]
Вторая итерация:
j == 1
self.QuestionsByLevel == [Q2, Q3, Q4, Q5]
SelectedQuestion = QuestionsByLevel[1] // Q3
// The following happens because you call removeObjectAtIndex:1
QuestionsByLevel = [Q2, Q4, Q5]
Третья итерация:
j == 2
self.QuestionsByLevel == [Q2, Q4, Q5]
SelectedQuestion = QuestionsByLevel[2] // Q5
// The following happens because you call removeObjectAtIndex:2
QuestionsByLevel = [Q2, Q4]
Четвертая итерация:
j == 3
self.QuestionsByLevel == [Q2, Q4]
SelectedQuestion = QuestionsByLevel[3] // CRASH!!!!
Вы видите проблему? Ваш цикл for предполагает, что вы будете обращаться к объектам по их индексу, но затем после каждой итерации вы удаляете что-то из массива, что сдвигает все индексы после этой точки. Вам не следует звонить removeObjectAtIndex:
, потому что вы пытаетесь пройти по массиву одновременно.
Если вы просто пытаетесь пропустить определенный объект, вы можете просто вызвать «продолжить», когда достигнете этого объекта. Если вы действительно хотите удалить его из массива, просто позвоните [QuestionsByLevel removeObject:GameLevel]
. Или то, что имеет смысл для вашей ситуации. Но сделайте это за до , пока не выполните итерацию по массиву.