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 生态系统的开发者常犯的错误。
在使用 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 生态系统的开发者常犯的错误。