#ios #objective-c #nsarray #avaudioplayer #indexoutofboundsexception
#iOS #цель-c #nsarray #avaudioplayer #исключение indexoutofboundsexception
Вопрос:
У меня есть метод, который постоянно обновляет текущее время AudioPlayer. В том же методе у меня есть переменная, которая увеличивается всякий раз, когда текущее значение времени аудиоПлеера становится равным значению времени, хранящемуся в массиве. Я использую следующий код, который отлично работает до 5-го значения, но затем приложение завершило работу и выдало ошибку out of bound index Array. Я не уверен, что я делаю не так. Вся идея состоит в том, чтобы выделить строку в пути к индексу, хранящуюся в переменной x, и увеличить выделение после определенного времени, сохраненного в timeArray
Переменная, определенная в интерфейсе
NSInteger x;
NSArray *timeArray;
метод проверки времени воспроизведения продолжает обновляться каждые 0,1 с с помощью NSTimer
- (void) checkPlaybackTime:(NSTimer *)thetimer { //method gets called every 0.1s
double time=audioPlayer.currentTime;
double currentNumber = [((NSNumber*)[timeArray objectAtIndex:x]) doubleValue];//gives the values stored in Array
if (time>0 amp;amp; time<currentNumber){ //i used this method to increment x
NSInteger*a =amp;x;
[self highlightcell:a];
}
if (time>=currentNumber amp;amp; time< 27.00){
NSInteger*b =amp;x;
[self highlightcell:b];
x ;
}
}
Ответ №1:
Предположим, что ваш timeArray
файл содержит 5 объектов. Тогда индекс последнего объекта в массиве будет x = 4
. Теперь, если вы увеличите x
значение до 5, затем -objectAtIndex:
попытаетесь получить 6-й объект из массива, который не может работать из-за массива, содержащего только 5 объектов — следовательно, этот индекс out of bounds
относится к массиву (поскольку только индексы 0 ..4 являются допустимыми значениями x
). ).
Чтобы избежать таких ситуаций, вы всегда должны проверять, что ваш индекс находится в пределах текущих границ массива, прежде чем пытаться получить доступ к элементу массива:
double currentNumber = 0.;
if (x < [timeArray count]) {
currentNumber = [[timeArray objectAtIndex:x] doubleValue];
}