Ios AVPlayer的奇怪行为
在使用AVFoundation framework中的AVPlayer时,我注意到一个非常奇怪的行为。我正试图从互联网上播放一些mp3广播文件 因此,我在Xcode中创建了一个新项目,并将以下代码添加到默认的ViewController中:Ios AVPlayer的奇怪行为,ios,swift,xcode,avfoundation,avplayer,Ios,Swift,Xcode,Avfoundation,Avplayer,在使用AVFoundation framework中的AVPlayer时,我注意到一个非常奇怪的行为。我正试图从互联网上播放一些mp3广播文件 因此,我在Xcode中创建了一个新项目,并将以下代码添加到默认的ViewController中: import UIKit import AVFoundation class ViewController: UIViewController { let player: AVPlayer = AVPlayer() override f
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对象播放歌曲,它的工作方式与预期的一样
但是,如果我从类块中删除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还是我应该注意这样的情况?正如Andrea Mugnani在我的帖子评论中解释的那样,我的第二个例子将导致ARC立即解除分配(自动参考计数)因为我们不保留对AVPlayer对象的强引用
这是新进入苹果生态系统的开发者的一个常见陷阱。我想你可能想在这里查一下:@Andreamugnani你能再解释一下吗。这些事情是如何关联的?在第二个示例中,
player
将在执行viewDidLoad
之后被释放,因为没有人指向这样的实例。因此,分配播放机时,retain count变为1,然后在viewDidLoad
之后变为0。在第一个示例中,保留计数为1并保持为1,因为该播放器是ViewController
的存储属性,它保留播放器
(直到未解除分配为止,在这种情况下,还应解除分配播放器
)@Andreamugnanii那么我如何确保player
在我的应用程序的整个生命周期内都是安全的呢?因为音乐播放器应该在后台也能正常工作。我不知道你的应用程序是如何构造的,请确保这样的player
放在“安全”的地方(可能是ViewController
)