Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 关闭viewcontroller后,如何停止AVPlayer并从superview中删除?_Iphone_Video Streaming_Avplayer - Fatal编程技术网

Iphone 关闭viewcontroller后,如何停止AVPlayer并从superview中删除?

Iphone 关闭viewcontroller后,如何停止AVPlayer并从superview中删除?,iphone,video-streaming,avplayer,Iphone,Video Streaming,Avplayer,我试图在iphone视频中使用AVPlayer播放视频,但当我关闭播放视频的视频控制器时,它会使我的应用程序崩溃???请帮助如何关闭AVPlayer并从其超级视图中删除。如果avPlayerLayer是唯一与AVPlayer交互的类,您不需要在用于表示它的类中使用属性来维护对它的引用(除非该类在您共享的代码之外使用它)。事实上,这可能就是为什么它没有按你期望的方式工作 剪辑继续播放的原因(我想)是因为玩家没有被释放。您创建它,在类中使用strong属性拥有它,然后它又被您交给的AVPlayerL

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

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

剪辑继续播放的原因(我想)是因为玩家没有被释放。您创建它,在类中使用strong属性拥有它,然后它又被您交给的AVPlayerLayer类所拥有。因此,当AVPlayerLayer被解除分配时,AVPlayer将失去一个所有者。但是它仍然有一个所有者(你的类),所以它没有被解除分配,并且它一直在玩。这里的解决方案是为了*avPlayer而完全放弃您拥有的财产。你不需要它。创建AVPlayer并将其传递给AVPlayerLayer。这应该是所有需要的

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

[avPlayer pause]
在AVPlayerLayer的dealloc方法中

回复:强引用与弱引用:强引用意味着所有权。由于ARC正在管理内存,它将执行您以前在代码中或在属性中执行的所有[object retain]和[object release]操作,即:

@property (retain) NSObject *iAmRetainedWhenProperyIsAssigned;
所以现在有了ARC,我们这些简单的用户在代码中或定义属性时不会使用像retain或release这样的词。但我们仍然设计软件。ARC是聪明的,但还不足以推断我们所定义的关系的架构含义。仍然需要告知类“拥有”对属性所引用对象的引用。从最基本的角度来看,这减少了我们:

(强)指弧前财产(拥有/保留)的弧前财产(保留)


(弱)意味着弧前财产(未拥有/未保留)的(分配)意味着弧前财产(未拥有/未保留)

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

现在,我将为您提供如何停止
AVPlayer
并从superview中删除的正确答案。实际上,在
AVPlayer
stop方法中没有,而是必须使用paused,它是由
AVPlayer
对象委托的

只需添加以下代码:

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

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

播放器是暂停,这很好。播放器是移除,这也很好。但当我解除视图控制器时,它会给出以下错误。提前感谢原因:“AVPlayerItem类的一个实例0x7f9e50d72dc0被释放,而键值观察者仍在该实例中注册。当前观察信息:(解决方案是在释放对象之前移除观察者。当您为成员替换或分配新对象时,您正在释放旧对象,因此您需要首先移除观察者[player removeObserver:self forKeyPath:@“status”];