如何在解除viewcontroller后停止AVPlayer并从superview中删除?

时间:2014-11-20 06:33:06

标签: iphone video-streaming avplayer

我正在尝试使用AVPlayer在iphone视频中播放视频运行良好但是当我关闭我的视频正在播放的视频控制器时,它会崩溃我的应用程序????请帮助如何关闭AVPLayer并从中删除它的超级视图

3 个答案:

答案 0 :(得分:0)

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

剪辑继续播放的原因(我认为)是因为玩家没有被解除分配。你创建它,拥有它在你的类中的强属性,而不是由你交给它的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 :(得分:0)

我的最后一个答案是理解该播放器对象如何在内存中运行,并且在Xcode 5.1之前,我们已经使用了一些我定义的方法。

现在我将给出正确的答案,如何停止AVPlayer并从superview中删除。实际上在AVPlayer停止方法不存在,你必须使用暂停,这是由AVPlayer对象委托。

只需添加以下代码:

[self.videoPlayer Pause];[self.avPlayerLayer removefromsuperlayer];self.videoPlayer = nil;

答案 2 :(得分:0)

解决方案是在释放对象之前移除观察者。当您为成员替换或分配新对象时,您将释放旧对象,因此您需要先删除观察者[player removeObserver:self forKeyPath:@" status"]; - Nandan Deshmukh