快速的iOS声音内存泄漏



正在测试我的应用程序,并在播放声音文件(任何声音文件)时注意到一些有趣的东西。我注意到较小的声音文件会增加大约 0.01 mb 的内存,并且在播放后不会释放内存,而播放完成后较长的声音文件会增加大约 1.8 - 2.0 mb。

使用仪器泄漏检查来测试应用程序,看看到底发生了什么,我收集到它确实是音频文件。

我通常使用 SKAction.playSoundFileNamed() 播放我的音频文件。不确定这是否与此有关。

let gameOver = SKAction.playSoundFileNamed("gameOver.wav", waitForCompletion: false)
sprite.runAction(gameOver)

不确定这是我的问题还是已知问题。或者这甚至是一个问题?只是好奇。

截图

几个月

前我遇到了这个问题,所以我尝试了AudioToolbox框架作为替代方案,它同样有效,没有内存泄漏。

我有一些音效想用于游戏,所以我创建了一个像 bellow 这样的函数,它可以设置 sfx 数组中的所有systemSoundID

var sfx = [SystemSoundID]()

func createSfx() {
    var i = 0
    while i < 8 {
        var fileName = ""
        switch i {
        case 0:
           fileName = "coinCollected"
        case 1:
            fileName = "laserGun"
        case 2:
            fileName = "laserBeamShutOff"
        case 3:
            fileName = "powerDown"
        case 4:
            fileName = "shipMovement"
        case 5:
            fileName = "openBlockade"
        case 6:
            fileName = "invisibilityOn"
        case 7:
            fileName = "outOfFuel"
        default:
            print("Error creating sfx")
        }
        sfx.append(SystemSoundID())
        let filePath = NSBundle.mainBundle().pathForResource(fileName, ofType: "wav")
        let soundURL = NSURL(fileURLWithPath: filePath!)
        AudioServicesCreateSystemSoundID(soundURL, &sfx[i])
        i += 1
    }
}

然后,您可以使用带有声音效果数组索引的 AudioServicesPlaySystemSound 播放声音效果,如下所示:

AudioServicesPlaySystemSound(sfx[1]) // Plays laserGun sound effect

另外,您知道,我在使用它时发现了一个问题。如果您使用AVAudioPlayer播放背景音乐,则音效的音量不会超过设备上的中点。我不确定为什么会发生这种情况,但我浪费了很多时间试图寻找音效的替代品,这是最好的选择,尽管有轻微的音量问题。

希望这可以帮助一些正在寻找SKAction的良好替代品的人。

最新更新