所以我在我的项目中使用ARC,当我添加一个AVPlayerLayer时,它工作得很好,但是当我从UINavigationItem弹出UIViewController时,视频继续在后台播放。有谁知道你会如何处理这个?这似乎很简单,我只是俯瞰。这是我最初实例化的代码。
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(弱)。任何情况下都要提前感谢您的帮助。
答案 0 :(得分:14)
如果avPlayerLayer是唯一与avPlayer交互的类,则不需要使用您用于呈现它的类中的属性来维护对它的引用(除非此类在代码之外使用它)共享)。事实上,这可能就是为什么它没有按照你期望的方式运作。
剪辑继续播放的原因(我认为)是因为玩家没有被解除分配。您创建它,使用您的类中的 strong 属性拥有它,而不是由您交给它的AVPlayerLayer类再次拥有它。因此,当取消分配AVPlayerLayer时,AVPlayer会丢失一个所有者。但它仍然拥有一个所有者(你的类),所以它没有被释放,并且它一直在玩。这里的解决方案是完全摆脱* avPlayer的拥有属性。你不需要它。创建AVPlayer并将其传递给AVPlayerLayer。这应该是所有需要的。
你可以做的其他事情可以解决行为而不是问题,请致电:
[avPlayer pause]
在你的AVPlayerLayer的dealloc方法中。
Re:强引用与弱引用:强引用意味着所有权。由于ARC正在管理内存,它将执行您之前在代码中完成的所有[对象保留]和[对象释放],或者您将使用属性执行的操作,即:
@property (retain) NSObject *iAmRetainedWhenProperyIsAssigned;
所以现在使用ARC,我们简单的用户不会在代码中使用诸如retain或release之类的词语,也不会在定义属性时使用。但我们仍然设计软件。 ARC很聪明,但不够聪明,无法推断出我们所定义的关系的架构含义。仍然需要告诉一个类“拥有”对属性引用的对象的引用。从最基本的角度来看,这减少了我们:
(强)意味着ARC(保留)对ARC之前的属性(拥有/保留)具有什么意义
(弱)对ARC意味着什么(赋值)意味着预先ARC(不拥有/不保留)
答案 1 :(得分:13)
也许你没有停顿。执行此操作然后删除图层并取消player
。
[player Pause];
[player removefromsuperlayer];
player = nil;
答案 2 :(得分:1)
如果要停止加载AVPlayerItem,请使用AVQueuePlayer的removeAllItems然后重新初始化它。
[self.avPlayer removeAllItems];
self.avPlayer = [AVQueuePlayer playerWithURL:[NSURL URLWithString:@""]];
self.avPlayer = nil;
这将阻止当前项目加载 - 这是我找到完成此任务的唯一方法。