ios - 从 NavigationController 移除 ViewController 后 AVPlayer 继续播放

标签 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;

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

最佳答案

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

剪辑继续播放的原因(我认为)是因为播放器没有被释放。你创建它,在你的类中使用 strong 属性拥有它,然后它又被你传递给它的 AVPlayerLayer 类拥有。所以当 AVPlayerLayer 被释放时,AVPlayer 失去了一个所有者。但它仍然有一个所有者(你的类(class)),所以它没有被释放,它继续播放。这里的解决方案是完全摆脱你对 *avPlayer 的拥有属性(property)。你不需要它。创建 AVPlayer 并将其传递给 AVPlayerLayer。这应该是所有需要的。

您可以做的其他事情可能会解决行为但不会解决问题,请调用:

[avPlayer pause]

在您的 AVPlayerLayer 的 dealloc 方法中。

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

@property (retain) NSObject *iAmRetainedWhenProperyIsAssigned;

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

(strong) 对 ARC 的意义与 (retain) 对 ARC 前属性(property)(拥有/保留)的意义相同

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

关于ios - 从 NavigationController 移除 ViewController 后 AVPlayer 继续播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8073098/

相关文章:

ios - NSURL 下载文件,指标显示来不及

ios - 我想导航到 webview 中的另一个文件。

ios - NSHashTable 保留弱引用

cocoa - NSInspiration 和 ARC(自动引用计数)

ios - Xcode 4.2 错误 : receiver type for instance message does not declare a method with selector

iphone - touchesBegan - iPhone 应用程序 UIView

ios - swift & AVAssetExportSession : encode MP4 video for Chrome and HTML5

ios - 当应用程序变为事件状态时,文件已加密或不是数据库消息

ios - 设置按钮标题时,具有淡入淡出效果

iphone - 从相机胶卷中选择的视频的 URL