2012-03-22 52 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