线程1:加载AVPlayer时EXC_BAD_ACCESS(code = EXC_I386_GPFLT)

我想加载一个AVPlayer,当我select一个collectionViewCell,这是我didSelectItem代码:

 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { if let item = items?[indexPath.item] { showPlayer(item: item) } } func showPlayer(item: Item) { let playerLauncher = PlayerLauncher() playerLauncher.showVideoPlayer() let playerView = PlayerView() playerView.item = item playerView.setupPlayerView() } 

这是我的PlayerLauncher文件:

 class PlayerView: UIView { var item: Item? { didSet { if let id = item?.itemId { itemId = id } } } var itemId = String() override init(frame: CGRect) { super.init(frame: frame) backgroundColor = UIColor(white: 0.3, alpha: 1) } var player: AVPlayer? func setupPlayerView() { let baseurl = "http://xample.com/play.m3u?id=" let urlString = "\(baseurl)\(itemId)" print(urlString) if let url = URL(string: urlString) { player = AVPlayer(url: url) let playerLayer = AVPlayerLayer(player: player) self.layer.addSublayer(playerLayer) playerLayer.frame = self.frame let audioSession = AVAudioSession.sharedInstance() do{ try audioSession.setCategory(AVAudioSessionCategoryPlayback) } catch let err { print(err) return } player?.play() player?.addObserver(self, forKeyPath: "currentItem.status", options: .new, context: nil) } } } class PlayerLauncher: NSObject { func showVideoPlayer() { print("Showing the player...") if let keyWindow = UIApplication.shared.keyWindow { let view = UIView(frame: keyWindow.frame) view.backgroundColor = UIColor.white view.frame = CGRect(x: keyWindow.frame.width - 10, y: keyWindow.frame.height - 10, width: 10, height: 10) let playerFrame = CGRect(x: 0, y: 0, width: keyWindow.frame.width, height: keyWindow.frame.height) let playerView = PlayerView(frame: playerFrame) view.addSubview(playerView) keyWindow.addSubview(view) UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: { view.frame = keyWindow.frame }, completion: { (completedAnimation) in //later... }) } } } 

所以无论何时我select该项目,玩家开始加载,控制台打印的URL(因为我已经添加了打印语句),这就是它打印:

 http://xample.com/play.m3u?id=12345 (lldb) 

然后在AppDelegate中崩溃并显示Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)错误。 我该如何解决?

谢谢。

更新:

我改了一下didSelectItem func。 这里是代码:

 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { if let item = items?[indexPath.item] { showPlayer(item: item) } } func showPlayer(item: Item) { let playerLauncher = PlayerLauncher() playerLauncher.showPlayer(item: item) } 

我将PlayerViewinit方法PlayerView为:

 var item: Item? { didSet { if let id = item?.itemId { itemId = id } } } init(frame: CGRect, item: Item) { super.init(frame: frame) self.item = item setupPlayerView() setupContainerView() backgroundColor = UIColor(white: 0.3, alpha: 1) } 

PlayerLauncher所需的更改:

 let playerView = PlayerView(frame: playerFrame, item: item) view.addSubview(playerView) 

我放了一个let playerView行rest,我可以看到通过那里的项目ID。 但是它没有传递给PlayerView类中的PlayerView 。 因此,ID仍然是" "

我已经做了一个指导,希望显示你一直误解。

我向其他读者道歉,因为不使用MARKDOWN文本格式,但请认为这是我最初的海报尝试。 我们已经在上一篇文章中进行了充分的讨论。

在这里输入图像说明

那么,你如何解决这个问题? 我想没有什么好直接给你的代码,请尝试修复基于这些信息的代码。

如果你有更多的问题,我会尽我所能来帮助你:)

它出现

 class PlayerLauncher: NSObject 

没有办法参考

 let playerView = PlayerView() 

尝试定义函数作用域之外的那些函数,以便它们可以被函数所改变并在函数之外被引用。