重复使用AVAudioPlayer播放不同的声音

9

我有一个AVAudioPlayer实例,将播放多个声音。是否有一种方法可以为AVAudioPlayer实例提供一个新的声音,或者我必须使用initWithData:创建一个新的实例?

我有一個AVAudioPlayer实例,要播放幾個聲音。有沒有一種方法可以為AVAudioPlayer實例提供新聲音,還是我必須使用initWithData:創建一個新實例?

2个回答

21

没有API可以向现有的AVAudioPlayer实例传递新文件。但是,AVAudioPlayer的创建并不昂贵,只要在使用完毕后释放实例,就不必担心性能问题。

如果您有一组固定的声音,这些声音会相互播放或可能重复播放,则可以为每个声音创建一个AVAudioPlayer实例,并通过在适当的实例上调用play来重复使用这些实例。

如果一次只播放一个声音,并且您正在生成新声音(例如基于用户输入的文本到语音),我通常将一个单独的播放器作为属性。当播放新声音时,我调用[player stop],释放旧播放器,并使用新声音文件实例化一个新的播放器。


2
是的,我在谷歌上搜索了这个问题,因为我认为创建很多新的AVAudioPlayer会导致性能下降。你的答案一次解决了我的问题。1)无法修改AVAudioPlayer中的文件2)创建AVAudioPlayer并不昂贵。 - Damn Vegetables
有关ARC的任何建议? - Piper

0

重复使用对象通常不是一个好主意,通常尽可能让您的对象的生存期尽可能短。这将减少代码可能状态的数量,并使其更容易理解。(“这个值来自哪里?也许它是前一个实例使用的剩余物?” 令人厌恶。)只有遇到可衡量的问题时才违反此规则。

如需进一步阅读与此思路相同的内容,您可以浏览 标记为“immutable”的问题


18
这不是对@ Fernando问题的回答,而是一种过度概括。在许多情况下,对象重用比新建对象更为合适。 - Christopher Pickslay
1
我认为Christopher是正确的。这是出于性能方面的考虑。例如,表视图重用现有单元格,而Apple明确鼓励这样做。至少你回答了张贴者的问题,“没有办法改变文件”,就像Christopher所做的那样。 - Damn Vegetables
表视图是一个特殊情况,因为它必须满足严格的性能要求(滚动)。但总的来说,新对象构造的性能成本今天相当低,我坚持认为在遇到性能问题之前重用对象是一个不好的想法。 - zoul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接