求助,大牛! AVPlayer 无法释放内存的问题!!!

Chary1n 2015-04-10 02:11:15

我在一个界面中使用了AVPlayer 可是当我返回上一个界面时,视频还有声音,并且内存没有释放, 这是我得remove observer代码
[[_player currentItem] removeObserver:self forKeyPath:@"loadedTimeRanges" context:nil];
[[_player currentItem] removeObserver:self forKeyPath:@"status" context:nil];
[_player removeObserver:self forKeyPath:@"rate" context:LSPlayer];

调试了几次 是status 这个地方没有释放掉。 导致不能自动调用dealloc
纠结了很久了, 请各位大牛 帮忙看看!! 感激不尽~
...全文
800 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
程老师2088 2015-04-14
  • 打赏
  • 举报
回复
-(void)dealloc { //释放监控 [self releaseObserver]; //释放player [self releasePlayer]; } -(void)releaseObserver { [player pause]; [player.currentItem seekToTime:kCMTimeZero]; @try { [[NSNotificationCenter defaultCenter] removeObserver:self name:@"AVPlayerItemDidPlayToEndTimeNotification" object:[player currentItem]]; [[NSNotificationCenter defaultCenter] removeObserver:self]; [player removeTimeObserver:timeObserver]; timeObserver = nil; [player removeObserver:self forKeyPath:@"rate" context:nil]; if (player.currentItem) { [player.currentItem removeObserver:self forKeyPath:@"status"]; [player.currentItem removeObserver:self forKeyPath:@"loadedTimeRanges"]; } [player removeObserver:self forKeyPath:@"currentItem"]; } @catch (NSException *exception) { // UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"释放失败" message:[NSString stringWithFormat:@"%@",exception] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; // [alert show]; } } -(void)releasePlayer { [player pause]; player = nil; } 我是这么释放的,这个东西确实挺蛋疼的
Bannings 2015-04-14
  • 打赏
  • 举报
回复
引用 5 楼 cl123cpzaihu 的回复:
[quote=引用 4 楼 chengzhf 的回复:]
-(void)dealloc
{
//释放监控
[self releaseObserver];

//释放player
[self releasePlayer];
}

-(void)releaseObserver
{
[player pause];
[player.currentItem seekToTime:kCMTimeZero];
@try {
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"AVPlayerItemDidPlayToEndTimeNotification" object:[player currentItem]];
[[NSNotificationCenter defaultCenter] removeObserver:self];
[player removeTimeObserver:timeObserver];
timeObserver = nil;
[player removeObserver:self forKeyPath:@"rate" context:nil];
if (player.currentItem) {
[player.currentItem removeObserver:self forKeyPath:@"status"];
[player.currentItem removeObserver:self forKeyPath:@"loadedTimeRanges"];
}
[player removeObserver:self forKeyPath:@"currentItem"];
}
@catch (NSException *exception) {
// UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"释放失败" message:[NSString stringWithFormat:@"%@",exception] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
// [alert show];
}
}

-(void)releasePlayer
{
[player pause];
player = nil;
}
我是这么释放的,这个东西确实挺蛋疼的



可是我得dealloc 不会自动调用呢。 是不是自己写个显视得方法 来调用呢[/quote]
不能自己手动调用 dealloc,你的情况应该是这个 Player 所在的 View 被强引用了,你去 Player 的所在 View 的 dealloc 里下断点,看有没有释放,如果没有的话,就说明是 View 内存泄漏了,在去 View 所在的 ViewController 的 dealloc 方法里下断点,看 ViewController 有没有释放
Chary1n 2015-04-14
  • 打赏
  • 举报
回复
引用 4 楼 chengzhf 的回复:
-(void)dealloc { //释放监控 [self releaseObserver]; //释放player [self releasePlayer]; } -(void)releaseObserver { [player pause]; [player.currentItem seekToTime:kCMTimeZero]; @try { [[NSNotificationCenter defaultCenter] removeObserver:self name:@"AVPlayerItemDidPlayToEndTimeNotification" object:[player currentItem]]; [[NSNotificationCenter defaultCenter] removeObserver:self]; [player removeTimeObserver:timeObserver]; timeObserver = nil; [player removeObserver:self forKeyPath:@"rate" context:nil]; if (player.currentItem) { [player.currentItem removeObserver:self forKeyPath:@"status"]; [player.currentItem removeObserver:self forKeyPath:@"loadedTimeRanges"]; } [player removeObserver:self forKeyPath:@"currentItem"]; } @catch (NSException *exception) { // UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"释放失败" message:[NSString stringWithFormat:@"%@",exception] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; // [alert show]; } } -(void)releasePlayer { [player pause]; player = nil; } 我是这么释放的,这个东西确实挺蛋疼的
可是我得dealloc 不会自动调用呢。 是不是自己写个显视得方法 来调用呢
Bannings 2015-04-10
  • 打赏
  • 举报
回复
恩,方不方便把工程打包发上来?这里面的细节挺多的
Chary1n 2015-04-10
  • 打赏
  • 举报
回复
可是 我如果不remove掉这些. 他调用不了dealloc的. 所以我就写了个方法,在viewdidappear的时候调用者方法 来remove这些观察者 但是还是不会自动调用dealloc 也就是说还有地方没有被释放
Bannings 2015-04-10
  • 打赏
  • 举报
回复
status放在dealloc里调用没问题,我做一个在线教育的项目的时候就是这么做的。 我怀疑是其他方面的原因
内容概要:本文针对网型T型三电平逆变器的低电压穿越(LVRT)能力及其综合控制策略开展深入研究,重点分析电网电压跌落条件下逆变器的动态响应特性与稳定性控制方法。研究基于Simulink平台构建详细的系统仿真模型,融合改进的电流环控制策略与中点电位平衡控制算法,有效提升逆变器在故障工况下的电流跟踪精度、过流抑制能力和直流侧中点电压稳定性。通过多场景仿真验证,所提出的综合控制策略能够显著增强逆变器在低电压穿越过程中的鲁棒性与电能质量,确保新能源系统在电网扰动下的持续可靠并网运行。; 适合人群:电力电子、新能源发电、电力系统自动化等相关专业的研究生、科研人员及从事并网逆变器设计与控制的工程技术人员。; 使用场景及目标:①深入理解三电平逆变器在电网故障下的运行机理与控制挑战;②掌握低电压穿越技术中电流限幅、故障响应及中点电位平衡的核心控制方法;③应用于光伏、风电等新能源并网系统的控制策略开发与仿真验证; 阅读建议:建议结合提供的Simulink仿真模型进行动手实践,重点关注控制器参数设计、中点电位观测与调节模块的实现逻辑,并通过对比不同电压跌落深度和控制策略的仿真结果,深化对系统动态行为与控制性能的理解。

29,040

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧