【问题标题】:Swift: Unmanaged AVAudioPlayer斯威夫特:非托管 AVAudioPlayer
【发布时间】:2015-07-18 14:20:57
【问题描述】:

我有AVAudioPlayer 实例:

var audioPlayer: AVAudioPlayer!
self!.audioPlayer = AVAudioPlayer(data: fileData, error: &error)
self!.audioPlayer?.numberOfLoops = -1
self!.audioPlayer?.delegate = self

if (self?.audioPlayer?.prepareToPlay() != false) {
    println("Successfully prepared for playing")
} else {
    println("Failed to prepare for playing")
}

我需要为此 AVAudioPlayer 禁用 ARC。 Unmanaged 没有很好的文档记录,所以很难做到这一点。这是我尝试过的:

var audioPlayer: Unmanaged<AVAudioPlayer>!
//Stuck after creating nil instance, what to do now?
self!.audioPlayer = AVAudioPlayer(data: fileData, error: &error)
self!.audioPlayer?.numberOfLoops = -1
self!.audioPlayer?.delegate = self

if (self?.audioPlayer?.prepareToPlay() != false) {
    println("Successfully prepared for playing")
} else {
    println("Failed to prepare for playing")
}

【问题讨论】:

  • “创建 nil 实例” - var audioPlayer: Unmanaged&lt;AVAudioPlayer&gt;! - 空 AVAudioPlayer
  • 了解为什么您要“禁用 ARC”会很有趣。这可能是XY problem 吗?
  • var audioPlayer: Unmanaged&lt;AVAudioPlayer&gt;! 声明了一个变量,它不创建任何东西。
  • 这就是我需要禁用 ARC 的原因

标签: ios swift automatic-ref-counting


【解决方案1】:

你应该写:

// Properties in your class
var unmanagedAudioPlayer: Unmanaged<AVAudioPlayer>
var audioPlayer : AVAudioPlayer!

// code
self.audioPlayer = AVAudioPlayer(...)
self.unmanagedAudioPlayer = Unmanaged.passRetained(self.audioPlayer)

现在您可以像往常一样使用self.audioPlayerAVAudioPlayer(或者如果您愿意,也可以使用AVAudioPlayer!,但我不明白为什么)。

self.unmanagedAudioPlayer 保留 self.audioPlayer 的保留引用,这样它就不能被 ARC 释放。

当你处理完这个AVAudioPlayer对象后,你可以调用self.unmanagedAudioPlayer.release()(或autorelease)来释放它,就像你在Objective-C中做的一样。

事实上,您不需要单独存储self.audioPlayer,因为您始终可以通过unmanagedAudioPlayer.takeUnratainedValue() 获取它,但它是一个很好的别名,可以让您的代码更具可读性。

【讨论】:

    【解决方案2】:

    这是一个没有问题的问题。 “关闭 ARC”的建议是错误的,您不应该尝试这样做。如果你有记忆问题,你应该直接解决它。例如,如果后台的 AVAudioPlayer 出现问题,请在进入后台时将其设置为 nil,以将其从内存中释放。但更重要的是,你应该问自己为什么一开始就有这个问题。我已经使用 AVAudioPlayer 多年了,我从来没有遇到过“它从内存中泄漏”的情况(不管你是什么意思)。

    【讨论】:

      猜你喜欢
      • 2017-07-22
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 2016-02-08
      • 2017-11-13
      • 2015-08-19
      相关资源
      最近更新 更多