在大多数情况下,当您触发异步系统调用并将资源传递给它时,系统会保留对该资源的强引用,因此它仍然可用。
AVAudioPlayer
似乎是个异常(exception)。
代码
func playSound() {
guard let soundFileURL = Bundle.main.url(forResource:"Shut your festering Gob", withExtension: "mp3") else {
return
}
let player = try? AVAudioPlayer(contentsOf: soundFileURL)
player?.play()
}
不起作用,因为当函数返回且音频播放器被释放时,局部变量 player
超出范围。
相比之下,调度 Timer
会在该计时器运行期间保留该计时器的目标。这似乎是基础类(class)的常态。
看起来 AVFoundation
应该在播放期间引用 AVAudioPlayer
。
有人知道 AVFoundation
不在播放期间保留音频播放器的具体原因吗?
最佳答案
鞋子在另一只脚上。当局部上下文结束(执行到达周围花括号的末尾)时,局部变量超出范围并不存在是正常的。其他行为是不寻常的。因此,您应该问为什么以及如何保留计时器!正如夏洛克·福尔摩斯所说,这就是奇怪的事件。
答案是,当您安排计时器时,您特别要求保留它(由当前运行循环)。那只是定时器的特殊架构。但是,通常保留对计时器的引用,以防您需要使其无效
。
关于ios - 为什么播放时系统不保留一个AVAudio播放器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42749414/