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

时间:2011-11-09 23:16:44

标签: ios cocoa-touch automatic-ref-counting avplayer

所以我在我的项目中使用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(弱)。任何情况下都要提前感谢您的帮助。

3 个答案:

答案 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;

这将阻止当前项目加载 - 这是我找到完成此任务的唯一方法。