【发布时间】:2018-02-05 02:31:23
【问题描述】:
在使用 AVFoundation 框架中的 AVPlayer 时,我注意到一个非常奇怪的行为。我正在尝试从 Internet 流式传输(播放)一些 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,然后让播放器对象播放这首歌,它就像预期的那样工作。
但是,如果我从类块中删除 player 对象实例化并将其放入 viewDidLoad 方法中,则代码根本不起作用(不播放任何内容)但它不会崩溃或吐出任何类型的错误或警告。
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 还是我应该注意这种情况?
【问题讨论】:
-
@AndreaMugnaini 你能解释一下吗?这些东西有什么关系?
-
在你的第二个例子中,
player将在viewDidLoad执行后被释放,因为没有人指向这样的实例。因此,当您分配播放器时,保留计数变为 1,然后在viewDidLoad之后变为 0。在第一个示例中,保留计数为 1 并保持为 1,因为此类播放器是ViewController的存储属性,它保留了player(直到未被释放,在这种情况下,player也应该被释放) -
@AndreaMugnaini 那么我如何确保
player在我的应用程序的整个生命周期中都是安全的?因为音乐播放器即使在后台也应该继续工作。 -
我不知道您的应用程序的结构如何,请确保将此类
player保存在“安全”的地方(可能是ViewController)
标签: ios swift xcode avfoundation avplayer