AVPlayer 的奇怪行为

Strange behavior of AVPlayer

在使用 AVFoundation 框架中的 AVPlayer 时,我注意到一个非常奇怪的行为。我正在尝试从互联网流式传输(播放)一些 mp3 广播文件。

所以我在Xcode中新建了一个项目,在默认的ViewController中添加了如下代码:

import UIKit
import AVFoundation

class ViewController: UIViewController {

    let player: AVPlayer = AVPlayer()

    override func viewDidLoad() {
        super.viewDidLoad()

        let asset = AVAsset(url: URL(string: "https://rfcmedia.streamguys1.com/Newport.mp3")!);
        let playerItem = AVPlayerItem(asset: asset);
        player.replaceCurrentItem(with: playerItem)
        player.play();
    }
}

那里没有什么特别有趣的事情发生。我只是用广播电台 URL 创建了一个 AVPlayerItem 实例并将其提供给 AVPlayer 然后让播放器对象播放歌曲并且它按预期工作。

但是,如果我从 class 块中删除 player 对象实例化并将其放入 viewDidLoad 方法中,代码根本不起作用(doesn 't play anything) 但它不会崩溃或吐出任何类型的错误或警告。

import UIKit
import AVFoundation

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let player: AVPlayer = AVPlayer()
        let asset = AVAsset(url: URL(string: "https://rfcmedia.streamguys1.com/Newport.mp3")!);
        let playerItem = AVPlayerItem(asset: asset);
        player.replaceCurrentItem(with: playerItem)
        player.play();
    }
}

我无法理解这种行为。为什么会这样?仅限于 AVPlayer 还是我应该注意这种情况?

正如 Andrea Mugnaini 在对我的 post 的评论中所解释的那样,我的第二个示例将导致 ARC[=] 立即释放 17=](自动引用计数)因为我们没有对 AVPlayer 对象保留 强引用

这是刚接触 Apple 生态系统的开发者常犯的错误。