使用导致内存泄漏的音频片段
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用导致内存泄漏的音频片段相关的知识,希望对你有一定的参考价值。
我有一个sprite-kit游戏场景(SKScene
),不时使用音频剪辑。我不想在每次需要运行短音频剪辑时创建新动作(SKAction
),因为声音可能会断断续续。因此,我使用文件名初始化一个操作变量,并在必要时准备好使用它。
class GameScene: SKScene {
let audioMatchAction = SKAction.playSoundFileNamed("myAudio", waitForCompletion: false)
}
然后,当我需要运行此音频剪辑时,我只使用以下代码行。
self.run(audioMatchAction)
考虑到所有情况,有一些迹象表明,当视图控制器(UIViewController
)设置场景时,内存可能会泄漏。所以我使用Allocations看看发生了什么。它说有两个泄漏指向AudioToolbox
库。无论如何,我已将上面的行改为以下内容。
let waitAction = SKAction.wait(forDuration: 1.0)
self.run(audioMatchAction, withKey: "audio")
self.run(waitAction, completion: {
self.removeAction(forKey: "audio")
})
分配仍然表示当应用程序转换到游戏视图控制器时有两个泄漏。我已经阅读了几十个关于SKAction
和音频剪辑的主题。有一些主题他们建议我们使用SKAudioNode
而不是SKAction.playSoundFileNamed
。我试过了。泄漏仍然存在。我甚至用过AVAudioPlayer
。我还有两次泄漏。如果我完全停止调用音频片段,Allocations将不会报告泄漏,这告诉我使用这些片段会导致泄漏。那么我该怎么做才能阻止音频片段泄漏内存?谢谢。
UPDATE
我想昨天我用AVAudioPlayer
的代码行来查看泄漏是否会消失。
class GameScene: SKScene {
let audioURLMatch = URL(fileURLWithPath: Bundle.main.path(forResource: "myAudio", ofType: "caf")!) as NSURL
var audioURLMatchPlayer = AVAudioPlayer()
override func didMove(to view: SKView) {
// audio //
do {
audioURLMatchPlayer = try AVAudioPlayer(contentsOf: audioURLMatch as URL)
audioURLMatchPlayer.prepareToPlay()
} catch let error {
}
}
}
为了将来参考,将audioURLMatchPlayer声明为类型而不是实例化播放器将防止内存泄漏。
使用var audioURLMatchPlayer: AVAudioPlayer?
而不是var audioURLMatchPlayer = AVAudioPlayer()
以上是关于使用导致内存泄漏的音频片段的主要内容,如果未能解决你的问题,请参考以下文章
如何使用模块化代码片段中的LeakCanary检测内存泄漏?