Ошибка вне пределов — синхронизация текущего времени AVAudioPlayer с переменной

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