Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios AVPlayer的奇怪行为_Ios_Swift_Xcode_Avfoundation_Avplayer - Fatal编程技术网

Ios AVPlayer的奇怪行为

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

在使用AVFoundation framework中的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,然后让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