Ios 为什么';播放过程中,系统是否保留AVAudio播放器?

Ios 为什么';播放过程中,系统是否保留AVAudio播放器?,ios,avfoundation,avaudioplayer,Ios,Avfoundation,Avaudioplayer,在大多数情况下,当您触发异步系统调用并向其传递资源时,系统会保留对该资源的强引用,以便该资源仍然可用 AVAudioPlayer似乎是个例外 代码 func playSound() { guard let soundFileURL = Bundle.main.url(forResource:"Shut your festering Gob", withExtension: "mp3") else { return } let player = try? AVAudioPlay

在大多数情况下,当您触发异步系统调用并向其传递资源时,系统会保留对该资源的强引用,以便该资源仍然可用

AVAudioPlayer
似乎是个例外

代码

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
超出范围

相反,调度一个
计时器
会在该计时器运行时保留其目标。这似乎是基础类的标准。

在播放期间,
AVFoundation
似乎应该引用
AVAudioPlayer


有人知道为什么在播放过程中,
AVFoundation
不能保留音频播放器的具体原因吗?

这是另一回事。当局部上下文结束时(执行到达周围大括号的末尾),局部变量超出范围和不存在是正常的。其他行为是不寻常的。因此,您应该询问为什么以及如何保留计时器!正如福尔摩斯所说,这是一个奇怪的事件


答案是,当您计划计时器时,您特别要求(由当前运行循环)保留它。这就是计时器的特殊结构。但是,通常都会保留对计时器的引用,以防您需要使其无效。

鞋是另一只脚。当局部上下文结束时(执行到达周围大括号的末尾),局部变量超出范围和不存在是正常的。其他行为是不寻常的。因此,您应该询问为什么以及如何保留计时器!正如福尔摩斯所说,这是一个奇怪的事件


答案是,当您计划计时器时,您特别要求(由当前运行循环)保留它。这就是计时器的特殊结构。但是,通常都会保留对计时器的引用,以防您需要
使其无效。

但是当我启动音频播放器播放时,我希望AVFoundation保留对它的拥有引用,因为它需要访问它才能播放它。但除非您被告知会发生这种情况,否则您不应该期待它。现在,如果你想在苹果公司提交一个增强请求,请这样做;我鼓励你这么做,因为这会让很多初学者措手不及,你可能知道。例如,您可以从语音识别器的案例中进行论证,在语音识别器中不需要保留任何内容。但当我开始播放音频播放器时,我希望AVFoundation保留对它的拥有引用,因为它需要访问它才能播放。但除非您被告知会发生这种情况,否则您不应该期望它。现在,如果你想在苹果公司提交一个增强请求,请这样做;我鼓励你这么做,因为这会让很多初学者措手不及,你可能知道。例如,您可以从语音识别器的案例中进行论证,其中不需要保留任何内容。
AVPlayer
也是如此。
AVPlayer
也是如此。