你需要一個屬性或伊娃的原因是它提供了強有力的參考。當使用ARC時,任何沒有強指針的對象都是公平的遊戲,而且事實上這就是你所看到的。
你也是正確的,一個AVAudioPlayer
強指針將只允許一次引用一個音頻播放器。
如果您選擇繼續使用AVAudioPlayer
的解決方案是使用某種集合對象來保存所有播放器實例的強引用。你可以使用一個NSMutableArray
如下所示:
編輯我調整了代碼稍微使播放的聲音方法需要一個NSString
soundName
參數。
@synthesize audioPlayers = _audioPlayers;
-(NSMutableArray *)audioPlayers{
if (!_audioPlayers){
_audioPlayers = [[NSMutableArray alloc] init];
}
return _audioPlayers;
}
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
[self.audioPlayers removeObject:player];
}
-(void)playSoundNamed:(NSString *)soundName{
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
pathForResource:soundName
ofType:@"wav"]];
AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
if (audioPlayer){
[audioPlayer setDelegate:self];
[audioPlayer prepareToPlay];
[audioPlayer play];
[self.audioPlayers addObject:audioPlayer];
}
}
通常的AVAudioPlayer
是矯枉過正一個聲音效果/音板應用。爲了快速聲「滴」,你可能會發現音頻工具箱框架,outlined in my answer to this question.
From looking at the System Sound class reference, it seems like you can only play one sound at a time.
它只能起到一個SystemSoundID
在同一時間。例如,如果你有soundOne和soundTwo。當soundTwo正在播放時,您可以播放soundOne,但一次不能播放一種聲音的多個實例。
What's the best way to be able to play sounds that can overlap while still being efficient with the amount of code and memory?
最好是意見。
如果你需要兩個相同聲音同時播放的實例,那麼我會說在這個答案中發佈的代碼將是代碼使用。由於相同聲音的每個重疊實例都需要創建新資源,因此使用audioPlayerDidFinishPlaying:
這樣的代碼更易於管理(內存可以很容易地被回收)。
如果相同聲音的重疊實例不是交易斷路器,那麼我認爲只需使用AudioServicesCreateSystemSoundID()
來創建每個聲音的一個實例就更有效率。
我絕對不會試圖管理每個按下按鈕的創建和處理SystemSoundID
s。這會匆匆出錯。在這種情況下,AVAudioPlayer
僅僅是可維護性的明顯贏家。
從查看System Sound類參考,看起來您一次只能播放一個聲音。能夠播放可重疊的聲音的最佳方式是什麼,而對代碼和內存的數量仍然有效? – robertfiorentino
@fiorgodx我編輯了我的答案以迴應您的評論。 – NJones
幫助我解決了當前正在播放的播放器的停止問題,並在啓動另一個播放器時釋放它(不停止播放按鈕)。現在,內存使用並不是天空飛揚,它只能作爲唯一一個音頻播放器的例子。謝謝 –