2011-12-11 41 views
0

我有一個帶有兩個按鈕的AVAudioPlayer:播放和停止。 播放時隱藏播放按鈕,反之亦然。如何安全地停止AVAudioPlayer

問題是,當我試圖在調用方法「audioPlayerDidFinishPlaying」時嘗試按下停止按鈕時,就在播放結束時發生崩潰。 的確,這個方法釋放AVAudioPlayer,當我按下停止按鈕(釋放對象的時候...)它崩潰了。 但是,我仍然測試如果玩家在手動釋放之前是否爲零,那爲什麼它會崩潰以及如何避免這種情況?

我的代碼: 在.H:

-(IBAction)playSound{ 
NSString *path = nil; 
if(path = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"sounds/%d", idoiseau] ofType:@"m4a"]) 
    { 
    monPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; 
    monPlayer.delegate = self; 
    [monPlayer play]; 
    [buttonPlay setEnabled:NO]; 
    [buttonStop setEnabled:YES]; 
    } 
else return; 
} 

-(IBAction)stopSound{ 
if(!monPlayer) return; 
[monPlayer stop]; 
[monPlayer release]; 
monPlayer = nil; 
[buttonPlay setEnabled:YES]; 
[buttonStop setEnabled:NO]; 
} 

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { 
[player release]; 
player = nil; 
    [buttonPlay setEnabled:YES]; 
[buttonStop setEnabled:NO]; 
} 

編輯:只需更換局部變量 「玩家」 通過在實例變量 「monPlayer」

@private AVAudioPlayer* monPlayer; 
在.M

委託方法,它的工作原理。感謝hotpaw2 :-)

回答

2

您的代碼似乎將本地參數播放器設置爲零而不是對象實例變量monPlayer。

+0

Ho ho ...你完全正確:現在它的工作原理是通過用實例變量替換局部變量。謝謝 ! – Chrysotribax