- [__NSCFString objectAtIndex:]: нераспознанный селектор отправлен на экземпляр - PullRequest
0 голосов
/ 21 марта 2012

У меня небольшая проблема в коде приложения iPhone, но я не могу определить.пожалуйста, помогите.

ниже мой код дает мне ошибку.

этот код находится в цикле.

- (void)playSoundSequence{     
if(songCounter >= totalSoundsInQueue || songCounter < 0){
    songCounter = 0;
}
NSLog(@"%d", songCounter);
sound = [[NSString alloc] initWithFormat:@"%@", [theSoundArray objectAtIndex:songCounter]];
NSLog(@"call");
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:sound ofType:@""]] error:NULL];
sound =  nil;
[sound release];
audioPlayer.delegate = self;
audioPlayer.volume = m_volSlider.value;
[audioPlayer play];
m_progressBar.progress = 0;
m_progressSlider.value = 0;
m_progressSlider.maximumValue = audioPlayer.duration;
[m_btnPlay setBackgroundImage:[UIImage imageNamed:@"pause.png"] forState:UIControlStateNormal];
bgTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateDisplay) userInfo:nil repeats:YES];
songCounter++;
}

songCounter - это целое число и одно за другим в соответствии с шагомloop.

В этом коде theSoundArray - это мой массив, который содержит, как показано ниже

"song1.mp3",
"song2.mp3",
"song3.mp3",
"song4.mp3" 

Проблема заключается в том, что каждый раз, когда мой цикл вызывался впервые, а songCounter был равен 0, он работал нормально.Затем второй раз зацикливается и "songCounter" равняется 1, тогда возникает проблема и выдает ошибку.

Ниже приведена ошибка.

-[__NSCFString objectAtIndex:]: unrecognized selector sent to instance

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Я надеюсь, что вы не сохранили массив, и поэтому, когда вы обращаетесь к нему через некоторое время, он выходит из строя.

Итак, выполните следующие действия при инициализации theSoundArray.См. retain

NSString *bundleRoot = [[NSBundle mainBundle] bundlePath]; 
NSFileManager *fm = [NSFileManager defaultManager]; 
NSArray *dirContents = [fm contentsOfDirectoryAtPath:bundleRoot error:nil]; 
NSPredicate *fltr = [NSPredicate predicateWithFormat:@"self ENDSWITH '.mp3'"]; 
theSoundArray = [[dirContents filteredArrayUsingPredicate:fltr] retain];

И попробуйте сейчас.

РЕДАКТИРОВАТЬ

И порядок в следующих утверждениях неправильный.

sound =  nil;
[sound release];

Вы отпускаете его, а затем устанавливаете на ноль.

0 голосов
/ 21 марта 2012

Вам нужно retain theSoundArray в течение необходимого вам периода времени, а затем release после этого. Он освобождается, и по его старому адресу начинает жить строка.

Если вы используете ARC, это не должно применяться. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...