2012-03-22 54 views
0

我想弄清楚的東西 -AVAudioPlayer初始化和內存管理

每次我用AVAudioPlayer我需要初始化一個新的AVAudioPlayer對象。

我有一個觀點10 對象,我希望這樣當用戶點擊句子中的應用程序將播放聲音文件「PlaySentence」方法來添加到每個句子的對象。

我需要很多的意見這種行爲,所以我想添加方法的對象類,所以我可以簡單地調用 -

[Sentence playSound]; 

由於AVAudioPlayer是初始化每次我想使用它的時候任何方式我看不出爲什麼這應該是更昂貴的操作。

我說得對嗎?對我來說這是一個不錯的選擇,爲什麼?

感謝

沙尼

回答

1

所以,如果我理解你的權利,你希望你的Sentence對象有playSound方法,它設置了一個AVAudioPlayer並播放聲音。

你絕對可以這樣做,但請注意,如果你有很多Sentence對象,那麼你最終會創建很多AVAudioPlayer對象。但是您可以在文件播放結束後將其釋放到高位,以防止高水位線過高。

另一種方法是在Sentence上有一個方法來返回要播放的文件的URL,然後在視圖控制器中只有一個AVAudioPlayer實例,您想要播放聲音並將其設置爲每個時間正確的文件。這將是我個人建議的做法。

+0

我不明白的是,爲什麼這種改變是因爲我每次改變句子都需要創建一個新玩家?所以任何方式,我會有很多palyers。順便說一下,我正在使用ARC,因此我無法自己釋放我的播放器。 – shannoga 2012-03-26 14:35:27

+0

如果你正在改變句子,那麼你仍然可以這樣做,就像我說'Sentence'返回文件的URL來播放/你正在播放的任何資產。如果使用ARC,您可以*自己釋放播放器。我並不是說發送'釋放'信息,但我的意思是將你用於玩家的伊娃設置爲零或類似。 – mattjgalloway 2012-03-26 14:45:43

0

我認爲最好的解決方案是使用Cocos2D庫中的SimpleAudioEngine。

它易於使用和集成良好。據我所知,它使用OpenAL和AVAudioPlayer。它具有簡單的界面來控制背景音樂,效果和與MP3,WAV,M4A和其他格式和編解碼器的作品。

使用它很容易:

// it's better to preload all effects during app start so they will play immediately when you call "playEffect" method 
[[SimpleAudioEngine sharedEngine] preloadEffect:@"sentence.m4a"]; 
... 
// play effect where you need it 
[[SimpleAudioEngine sharedEngine] playEffect:soundName]; 

你可以找到它here cocos2d的庫裏面。你可以找到關於它的所有有用信息here