可重复使用的扩展,在iOS和Swift中播放没有内存泄漏的声音?

时间:2016-03-24 20:00:06

标签: ios swift swift2 ios9

在代码中播放声音非常冗长,并且如果可能的话,想要创建AVAudioSession的扩展。我这样做的方法是将一个对象分配给一个变量,但需要帮助/建议如何设置这个函数,以便它可以重用和优化。

这就是我所拥有的:

func playSound(name: String, extension: String = "mp3") {
    let sound = NSBundle.mainBundle().URLForResource(name, withExtension: extension)

    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        try AVAudioSession.sharedInstance().setActive(true)

        UIApplication.sharedApplication().beginReceivingRemoteControlEvents()

        audioPlayer = try AVAudioPlayer(contentsOfURL: sound!)
        audioPlayer?.prepareToPlay()
        audioPlayer?.play()
    } catch { }
}

我想我必须在这个函数之外创建audioPlayer变量,否则我很难玩任何东西。也许它可以自成一体?我希望用这样的东西:

AVAudioSession.sharedInstance().play("bebop")

2 个答案:

答案 0 :(得分:3)

直接从您的示例中获取代码,我看到两个选项:

1)您是否有任何特殊原因要将其作为AVAudioSession的扩展?如果没有,只需自己做服务!

class AudioPlayerService {

    static let sharedInstance = AudioPlayerService()

    var audioPlayer: AVAudioPlayer?

    func playSound(name: String, extension: String = "mp3") {
        let sound = NSBundle.mainBundle().URLForResource(name, withExtension: extension)

        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)

            UIApplication.sharedApplication().beginReceivingRemoteControlEvents()

            audioPlayer = try AVAudioPlayer(contentsOfURL: sound!)
            audioPlayer?.prepareToPlay()
            audioPlayer?.play()
        } catch { }
    }

}

2)如果执行需要将其作为AVAudioSession的扩展,请查看associated objects

extension AVAudioSession {

    private struct AssociatedKeys {
        static var AudioPlayerTag = "AudioPlayerTag"
    }

    var audioPlayer: AVAudioPlayer? {
        get {
            return objc_getAssociatedObject(self, &AssociatedKeys.AudioPlayerTag) as? AVAudioPlayer
        }

        set {
            if let newValue = newValue {
                objc_setAssociatedObject(
                    self,
                    &AssociatedKeys.AudioPlayerTag,
                    newValue as AVAudioPlayer?,
                    .OBJC_ASSOCIATION_RETAIN_NONATOMIC
                )
            }
        }
    }

    func playSound(name: String, extension: String = "mp3") {
        let sound = NSBundle.mainBundle().URLForResource(name, withExtension: extension)

        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)

            UIApplication.sharedApplication().beginReceivingRemoteControlEvents()

            audioPlayer = try AVAudioPlayer(contentsOfURL: sound!)
            audioPlayer?.prepareToPlay()
            audioPlayer?.play()
        } catch { }
    }

}

答案 1 :(得分:1)

这是我发现添加声音的最好方法

文件名是shootMissile.wav

func shootMissileSound() {
    if let soundURL = NSBundle.mainBundle().URLForResource("shootMissile", withExtension: "wav") {
        var mySound: SystemSoundID = 0
        AudioServicesCreateSystemSoundID(soundURL, &mySound)
        AudioServicesPlaySystemSound(mySound);
    }
}