我在一个界面中使用了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
纠结了很久了,  请各位大牛 帮忙看看!!  感激不尽~ 

解决方案 »

  1.   

    status放在dealloc里调用没问题,我做一个在线教育的项目的时候就是这么做的。
    我怀疑是其他方面的原因
      

  2.   

    可是 我如果不remove掉这些.  他调用不了dealloc的.   所以我就写了个方法,在viewdidappear的时候调用者方法 来remove这些观察者  但是还是不会自动调用dealloc  也就是说还有地方没有被释放
      

  3.   

    -(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;
    }
    我是这么释放的,这个东西确实挺蛋疼的
      

  4.   

    可是我得dealloc 不会自动调用呢。   是不是自己写个显视得方法 来调用呢
      

  5.   

    可是我得dealloc 不会自动调用呢。   是不是自己写个显视得方法 来调用呢
    不能自己手动调用 dealloc,你的情况应该是这个 Player 所在的 View 被强引用了,你去 Player 的所在 View 的 dealloc 里下断点,看有没有释放,如果没有的话,就说明是 View 内存泄漏了,在去 View 所在的 ViewController 的 dealloc 方法里下断点,看 ViewController 有没有释放