2012-03-21 1 views
0

내 iPhone 응용 프로그램 코드에 약간의 문제가 있지만 식별 할 수 없습니다. 도와주세요.- [__ NSCFString objectAtIndex :] : 인스턴스로 전송 된 인식 할 수없는 선택 자

내 코드가 오류입니다.

이 코드는 반복됩니다.

- (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에서

내 루프를 호출하고 "songCounter는"그것은 잘 달린다 0이었다 때마다 처음 문제가 울부 짖는 소리

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

같이 포함 내 배열입니다. 두 번째 시간이 루프에 들어가서 "songCounter"가 1이면 문제가있어 오류가 발생합니다.

아래 오류입니다.

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

'theSoundArray' 작성 방법에 대한 코드를 보여주십시오. – mattjgalloway

+0

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

+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로 설정합니다.

+0

생명의 은인 ...... 해결되었습니다 .... 감사합니다 Aadhira. –

+0

당신은 환영합니다. 내 대답이 당신의 문제를 해결해 주어 기쁘다. – Ilanchezhian

+0

답이 맞으면 대답으로 표시 할 수 있습니다. – Ilanchezhian

0

필요한 기간 동안 retaintheSoundArray이 필요하고 이후에 release이 필요합니다. 할당이 해제되고 문자열이 이전 주소에서 거주하게됩니다.

ARC를 사용하는 경우에는 적용되지 않습니다. :)

+0

고마워요 ... "보유"로 해결되었습니다. –

관련 문제