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

Jam*_*ker 23 cocoa-touch ios avplayer automatic-ref-counting

所以我在我的项目中使用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];
Run Code Online (Sandbox Code Playgroud)

这也是我如何确定属性的方式.

@property (strong) AVPlayer *player;
@property (strong) AVPlayerLayer *avPlayerLayer;
@property (strong) AVPlayerItem *currentItem;
Run Code Online (Sandbox Code Playgroud)

也许这完全错了.我不确定何时使用(强)vs(弱).任何情况下都要提前感谢您的帮助.

isa*_*aac 14

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

剪辑继续播放的原因(我认为)是因为玩家没有被解除分配.你创建它,拥有它在你的类中的属性,而不是由你交给它的AVPlayerLayer类再次拥有它.因此,当取消分配AVPlayerLayer时,AVPlayer会丢失一个所有者.但它仍然拥有一个所有者(你的类),所以它没有被释放,并且它一直在播放.这里的解决方案是完全摆脱*avPlayer的拥有属性.你不需要它.创建AVPlayer并将其传递给AVPlayerLayer.这应该是所有需要的.

您可以做的其他事情可以解决行为而不是问题,请致电:

[avPlayer pause]
Run Code Online (Sandbox Code Playgroud)

在你的AVPlayerLayer的dealloc方法中.

Re:强引用与弱引用:强引用意味着所有权.由于ARC正在管理内存,它将执行您之前在代码中完成的所有[对象保留]和[对象释放],或者您将对属性执行的操作,即:

@property (retain) NSObject *iAmRetainedWhenProperyIsAssigned;
Run Code Online (Sandbox Code Playgroud)

所以现在使用ARC,我们简单的用户不会在代码中或在定义属性时使用诸如retain或release之类的单词.但我们仍然设计软件.ARC很聪明,但不够聪明,无法推断出我们所定义的关系的架构含义.仍然需要告诉一个类"拥有"对属性引用的对象的引用.从最基本的角度来看,这减少了我们:

(强)指ARC(保留)对ARC之前的属性(拥有/保留)意味着什么

(弱)对ARC意味着什么(赋值)意味着预先ARC(不拥有/不保留)


小智 13

也许你没有停顿.这样做然后删除图层并使其无效player.

[player Pause];
[player removefromsuperlayer];
player = nil;
Run Code Online (Sandbox Code Playgroud)