iOS内存泄漏,AVPlayer永远不会释放
我使用的是来自的AVPlayerDemo示例,并在其上编写了自己的UI来播放从UITableViewController中选择的视频。现在,问题是这里的某个地方有内存泄漏,我找不到。问题是AVPlayer对象没有被解除分配,我猜这是因为每次按下后退按钮并选择一个新视频播放时,应用程序消耗的总内存都会大幅增加,如下所示: 第一次播放视频时,内存使用量为36.6MB,现在是第二次: 在这里,它已经跃升到58.2MB,并且每次我返回并再次播放视频或其他视频时,它都会继续增加 我试过使用有泄漏的仪器,但还没能找出它有什么问题 这是整个控制器文件 //编辑iOS内存泄漏,AVPlayer永远不会释放,ios,memory-leaks,profiling,instruments,avplayer,Ios,Memory Leaks,Profiling,Instruments,Avplayer,我使用的是来自的AVPlayerDemo示例,并在其上编写了自己的UI来播放从UITableViewController中选择的视频。现在,问题是这里的某个地方有内存泄漏,我找不到。问题是AVPlayer对象没有被解除分配,我猜这是因为每次按下后退按钮并选择一个新视频播放时,应用程序消耗的总内存都会大幅增加,如下所示: 第一次播放视频时,内存使用量为36.6MB,现在是第二次: 在这里,它已经跃升到58.2MB,并且每次我返回并再次播放视频或其他视频时,它都会继续增加 我试过使用有泄漏的仪
-(void) viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
if(_player.rate == 1.0){
[_player pause];
}
[idleTimer invalidate];
if(mTimeObserver){
[_player removeTimeObserver:mTimeObserver];
mTimeObserver = nil;
}
[_playerItem removeObserver:self forKeyPath:kStatusKeyT];
[[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:_playerItem];
_player = nil;
_playerItem = nil;
idleTimer = nil;
_tapGestureRecognizer = nil;
}
-(void) dealloc
{
NSLog(@"DEALLOCING");
}
问题出在闲散者身上。在idleTimer上调用invalidate方法时,它不会同步使计时器无效,而是等待下一个滴答声(不确定,但会等待一段时间),然后使其无效并释放
现在,与此同时,idleTimer引用被设置为nil。在计时器的下一个滴答声中,引用丢失,内存永远不会释放,引用会一直传播到ViewController,其对象都不会被释放。我和您有相同的问题,但我通过调用
ViewDidEnglish
解决了内存泄漏问题:
self.avPlayer?.replaceCurrentItem(with: nil)
很抱歉,没有人会对您的整个文件进行筛选…您需要通过调试更多文件来缩小范围(例如,禁用某些功能并重试,或使用instruments中的分配视图来确定保留文件的位置等),我知道,我只是添加了全部内容,这样我就不会遗漏任何可能导致泄漏的内容。。我会复制相关代码并粘贴到这里。@FarazHassan你们试过向苹果公司报告罚单吗?@CAMOBAP很抱歉,我从来并没有发布过这个问题的答案。我解决了这个问题,它与AVPlayer本身无关。现在就发。请查收,谢谢。这解决了我的问题。非常感谢你在这里发帖。