从AVFoundation框架使用AVPlayer时,我注意到了一种非常奇怪的行为。我正在尝试从互联网上播放(播放)一些mp3广播文件。
所以我在Xcode中创建了一个新项目,并将以下代码添加到默认的ViewController:
TPngImage
那里没有什么特别有趣的事情。我只是用电台URL创建一个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();
}
}
实例并将其提供给AVPlayer,然后让播放器对象播放该歌曲,它就像预期的那样工作。
但是,如果我从类块中删除AVPlayerItem
对象实例化并将其放在player
方法中,则代码根本不起作用(不播放任何内容)但它没有不要崩溃或吐出任何类型的错误或警告。
viewDidLoad
我无法理解这种行为。为什么会这样?它仅限于AVPlayer,还是我应该注意这样的情况?
答案 0 :(得分:1)
正如Andrea Mugnaini在我的帖子的评论中解释的那样,我的第二个例子是 ARC (自动引用计数)导致立即释放,因为我们没有&# 39;保持强引用到AVPlayer对象。
这是Apple新生态系统开发人员常见的陷阱。