Ios AVAudioPlayer初始化&;内存管理

Ios AVAudioPlayer初始化&;内存管理,ios,memory-management,avaudioplayer,Ios,Memory Management,Avaudioplayer,我在想办法- 每次使用AVAudioPlayer时,我都需要初始化一个新的AVAudioPlayer对象 我在一个视图中有10个句子对象,我希望为每个句子对象添加一个“PlayStation”方法,这样当用户点击句子时,应用程序将播放一个声音文件 我在很多视图上都需要这种行为,所以我想将该方法添加到对象类中,这样我就可以简单地调用- [Sentence playSound]; 由于AVAudioPlayer在每次我希望使用它时都以任何方式初始化,所以我不明白为什么这会是一个更昂贵的操作 我说得

我在想办法-

每次使用AVAudioPlayer时,我都需要初始化一个新的AVAudioPlayer对象

我在一个视图中有10个句子对象,我希望为每个句子对象添加一个“PlayStation”方法,这样当用户点击句子时,应用程序将播放一个声音文件

我在很多视图上都需要这种行为,所以我想将该方法添加到对象类中,这样我就可以简单地调用-

[Sentence playSound];
由于AVAudioPlayer在每次我希望使用它时都以任何方式初始化,所以我不明白为什么这会是一个更昂贵的操作

我说得对吗/这是满足这种需求的好方法吗?为什么

谢谢


Shani

如果我理解正确,你希望你的
句子
对象有一个
playSound
方法,该方法设置一个
AVAudioPlayer
并播放声音

你当然可以这样做,但是要注意,如果你有很多
句子
对象,那么你最终会创建很多
AVAudioPlayer
对象。但是你可以在文件播放结束后,通过在处释放它来阻止高水位线过高


另一种方法是,在
语句
上有一个方法返回要播放的文件的URL,然后在视图控制器中有一个
AVAudioPlayer
实例,在其中播放声音,并每次为正确的文件进行设置。这将是我个人建议的方法。

我认为最好的解决方案是使用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];

您可以在Cocos2D库中找到它。你可以找到关于它的所有有用信息。

我不明白的是,为什么每次我改变句子时,我都需要创建一个新的播放器,所以这种情况会改变?所以不管怎样,我都会有很多乐手。顺便说一句,我正在使用ARC,所以我自己不能释放我的播放器。如果你正在更改句子,那么你仍然可以像我所说的那样使用
句子
返回要播放的文件的URL/无论你正在播放的是什么资源。如果使用ARC,您可以自己释放玩家。我的意思不是发送
release
消息,而是将播放器使用的ivar设置为零或类似。