2012-10-08 4 views
0
if (mPlayerItem){ 
    [mPlayerItem removeObserver:self forKeyPath:kStatusKey]; 

    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:AVPlayerItemDidPlayToEndTimeNotification 
                object:mPlayerItem]; 
} 

//create AVPlayerItem 
NSURL *url = [self getUrlWithROAudio:audioFile]; 

mPlayerItem = [AVPlayerItem playerItemWithURL:url]; 
[mPlayerItem addObserver:self 
       forKeyPath:kStatusKey 
       options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew 
       context:nil]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(playerItemDidReachEnd:) 
              name:AVPlayerItemDidPlayToEndTimeNotification 
              object:mPlayerItem]; 

나는 새로운 AVPlayerItem을 만들 때 마지막이 존재하고, removeObserver 하지만 난
가 가지고 있다면, 내가 확인합니다 - [AVPlayerItem removeObserver : forKeyPath :] : 메시지 할당이 해제 된 인스턴스로 전송AVPlayerItem removeObserver : 오류를 얻을 forKeyPath

누구나 아는 이유는 무엇입니까?

답변

2

어느 시점에서 mPlayerItem이 가리키는 개체가 해제되었지만 mPlayerItemnil으로 설정되어 있지 않습니다. 플레이어 인스턴스를 유지 또는 과도하게 풀어 놓을 수있는 장소를 찾습니다.

+0

mPlayerItem이 nil이거나 출시되지 않은 경우 if (mPlayerItem)? – icefox

+0

removemPlayerItem의 Observer를 삭제하고 동일한 keypath에 대해 새 객체를 추가하면. 괜찮 니? – icefox

+1

'mPlayerItem'에 의해 가리켜지는 객체가 해제되면, 그것은 여전히이 예외를 야기하는 nil 검사를 통과 할 것입니다. 이것은 수동 참조 카운트 관리의 일종입니다. – warrenm

관련 문제