ViewController从NavigationController中移除后,AVPlayer继续播放

所以我在我的项目中使用ARC,当我添加一个AVPlayerLayer它工作得很好,但是当我从我的UINavigationItempopupUIViewControllervideo继续在后台播放。 有谁知道你会如何处理这个? 这似乎很容易,我只是俯瞰。 这是我最初实例化的代码。

self.currentItem = [[AVPlayerItem alloc] initWithURL:url]; self.player = [[AVPlayer alloc]initWithPlayerItem:self.currentItem]; self.avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:player]; self.avPlayerLayer.bounds = self.view.bounds; self.avPlayerLayer.frame = CGRectMake(0,55, 1024, 670); self.view.backgroundColor = [UIColor clearColor]; [self.view.layer addSublayer:avPlayerLayer]; 

这也是我如何拥有定义的属性。

 @property (strong) AVPlayer *player; @property (strong) AVPlayerLayer *avPlayerLayer; @property (strong) AVPlayerItem *currentItem; 

也许这完全是错误的。 我不确定何时使用(强)vs(弱)。 任何情况下,提前谢谢你的帮助。

如果avPlayerLayer是唯一与avPlayer进行交互的类,那么您不需要在您使用的类的属性中维护对它的引用(除非此类在共享的代码之外使用它)。 事实上,这可能是为什么它不按照你期望的方式工作。

剪辑继续播放的原因(我认为)是因为播放器没有被释放。 你创build它,拥有你的类中的强大属性,而不是由你交给的AVPlayerLayer类所拥有。 所以当AVPlayerLayer被释放时,AVPlayer就失去了一个所有者。 但它仍然有一个所有者(你的class级),所以它不被释放,并继续玩。 这里的解决scheme是彻底摆脱* avPlayer的拥有财产。 你不需要它。 创buildAVPlayer并将其传递给AVPlayerLayer。 这应该是所有需要的。

你可以做的其他事情可能会解决问题,但不是问题,请拨打:

 [avPlayer pause] 

在你的AVPlayerLayer的dealloc方法中。

回复:强与弱引用:强大的参考意味着所有权。 由于ARC正在pipe理内存,因此它将执行您之前在代码中完成的所有[对象保留]和[对象释放],或者您将使用属性完成的操作,即:

 @property (retain) NSObject *iAmRetainedWhenProperyIsAssigned; 

所以现在使用ARC,我们简单的用户不要在代码中或定义属性时使用保留或释放等词语。 但是我们仍然在devise软件。 ARC很聪明,但还不足以推断我们定义的关系的架构含义。 它仍然需要被告知,一个类“拥有”该属性引用的对象。 从最基本的angular度来看,这就减less了我们:

(强)是指ARC(保留)对ARC之前的属性(拥有/保留)

(弱)的意思是指什么(分配)意味着合适的ARC前(不拥有/不保留)

也许你没有停下来。 做到这一点,然后删除层和无效player

 [player Pause]; [layer removefromsuperlayer]; player = nil; 

当你想停止加载AVPlayerItem时,使用AVQueuePlayer的removeAllItems,然后重新初始化它。

  [self.avPlayer removeAllItems]; self.avPlayer = [AVQueuePlayer playerWithURL:[NSURL URLWithString:@""]]; self.avPlayer = nil; 

这将停止加载当前项目 – 这是我发现完成这一点的唯一方法。