- [__ NSCFString objectAtIndex:]:发送到实例的无法识别的选择器

时间:2012-03-21 12:04:14

标签: iphone

我的iPhone应用程序代码没什么问题,但无法识别。请帮忙。

bellow是我的代码给了我错误。

此代码已循环播放。

- (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是整数,并且根据循环逐个递增。

在此代码theSoundArray中,我的数组包含类似于下面的

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

问题是每次第一次调用我的循环时,&#34; songCounter&#34;是0它运行正常。然后第二次进入循环和#34; songCounter&#34;是1然后有问题,并给我错误。

以下是错误。

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

2 个答案:

答案 0 :(得分:2)

我希望你没有保留数组,所以当你在一段时间后访问它时,它会崩溃。

因此,在初始化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];

您释放它然后将其设置为nil。

答案 1 :(得分:0)

您需要retain theSoundArray一段时间,然后再release。它正在被取消分配,并且一根字符串正在其旧地址居住。

如果您使用的是ARC,则不适用。 :)