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

2024-05-17

因此,我在项目中使用 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;

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


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

剪辑继续播放的原因(我认为)是因为播放器没有被释放。你创造它,拥有它strong您的类中的属性,而不是您将其交给的 AVPlayerLayer 类再次拥有它。因此,当 AVPlayerLayer 被释放时,AVPlayer 就失去了一个所有者。但它仍然有一个所有者(您的班级),因此它不会被释放,并且会继续播放。这里的解决方案是完全摆脱您对 *avPlayer 的所有权。你不需要它。创建 AVPlayer 并将其传递给 AVPlayerLayer。这应该就是所需要的一切。

您可以采取其他措施来解决该行为,但不能解决问题,请致电:

[avPlayer pause]

在 AVPlayerLayer 的 dealloc 方法中。

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

@property (retain) NSObject *iAmRetainedWhenProperyIsAssigned;

So now使用 ARC,我们简单的用户不会在代码中或定义属性时使用保留或释放等单词。但我们仍然设计软件。 ARC 很聪明,但还不够聪明,无法推断出我们正在定义的关系的架构含义。仍然需要告知类“拥有”对该属性所引用的对象的引用。从最基本的角度来说,这减少了我们:

(强)对于 ARC 意味着(保留)对于 ARC 之前的财产(拥有/保留)意味着什么

(弱)意味着 ARC 什么(分配给 ARC 前的属性(不拥有/不保留)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 NavigationController 中删除 ViewController 后 AVPlayer 继续播放 的相关文章

随机推荐