求助,大牛! 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
纠结了很久了, 请各位大牛 帮忙看看!! 感激不尽~
...全文
745 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里调用没问题,我做一个在线教育的项目的时候就是这么做的。 我怀疑是其他方面的原因

29,031

社区成员

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

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