首先,谢谢你的帮助。
问题:
1.我需要测试很多视频。我写了两种测试视频的方法。
2.播放视频状态时,我设置了avPlayer = nil和avPlayerItem = nil,我也添加了@autoreleasepool {},但内存慢慢增加,我使用的是仪器,但我没有发现内存泄漏,我发现很多问题并没有找到解决方案。
3.这是我的代码:
-(void)CheckVideoURlCanPlay{
@autoreleasepool {
VideoPlayDataObj *videoPlay = [self.needCheckArr objectAtIndex:0];
NSString *str = videoPlay.videoURL;
NSURL *url = [NSURL URLWithString:str];
self.playItem = [AVPlayerItem playerItemWithURL:url];
self.player = [AVPlayer playerWithPlayerItem:self.playItem];
self.playLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
self.playLayer.videoGravity = AVLayerVideoGravityResizeAspect;
self.playLayer.frame=CGRectMake(100, 80, 100, 100);
[self.view.layer addSublayer:self.playLayer];
[self.player play];
[self.playItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
}}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
@autoreleasepool {
if ([keyPath isEqualToString:@"status"]) {
if (self.player.currentItem.status == AVPlayerItemStatusReadyToPlay) {
@autoreleasepool {
[self.player.currentItem.asset cancelLoading];
[self.player.currentItem cancelPendingSeeks];
[self.player cancelPendingPrerolls];
[self.playItem removeObserver:self forKeyPath:@"status"];
self.playItem = nil;
self.player = nil;
}
[self.needCheckArr removeObjectAtIndex:0];
[NSThread sleepForTimeInterval:5];
[self CheckVideoURlCanPlay];
}
}
}
}
4.我也试图减轻目前的观点,但并不能解除所有观点。如果你玩大量的视频内存会很高,最终的应用程序将被杀死。
5.我想知道加载视频后是否会产生脏内存?
这个我的应用程序启动内存:13M 这个测试一些视频,我弹出视图: enter image description here 这将再次测试一些视频并弹出视图: enter image description here
6.最后,我希望你能帮助我,非常感谢你。
答案 0 :(得分:1)
看起来您从视图中删除AVPlayerLayer似乎不是:
[self.playerLayer removeFromSuperlayer];
此外,我无法在@autoreleasepool
看到这一点,特别是如果你打开ARC(你几乎肯定会这样做!)。 @autoreleasepool
通常仅在您关闭ARC时,或者在单个主循环调用中通过大量内存(如数兆字节)进行搅拌时才有用,并且需要控制它们何时被清除。