2014-11-20 2 views

답변

0

avPlayerLayer가 avPlayer와 상호 작용하는 유일한 클래스 인 경우이 클래스가 코드 외부에서이를 사용하지 않는 한, 현재 사용하고있는 클래스의 속성으로 참조를 유지 관리 할 필요가 없습니다. 공유 됨). 사실, 이것이 아마도 당신이 기대하는대로 작동하지 않는 이유 일 것입니다.

클립이 계속 재생되는 이유는 플레이어가 할당 취소되지 않기 때문입니다. 클래스에 강력한 속성을 가진 속성을 만들면,이 속성을 전달하는 AVPlayerLayer 클래스에서 다시 소유하게됩니다. 따라서 AVPlayerLayer가 할당 해제되면 AVPlayer는 하나의 소유자를 잃게됩니다. 하지만 여전히 소유자 (클래스)가 있으므로 할당이 해제되지 않고 계속 재생됩니다. 여기 해결책은 * avPlayer에 대한 소유 자산을 모두 제거하는 것입니다. 너는 필요 없어. AVPlayer를 만들어 AVPlayerLayer에 전달합니다. 그것이 모두 필요한 것입니다. 동작하지만 문제를 해결할 수있는 당신이 할 수있는 다른

뭔가, 전화 :

[avPlayer pause] 

당신의 AVPlayerLayer의 할당 해제의 방법에서.

Re : Strong vs. Weak 참조 : 강력한 참조는 소유권을 의미합니다.

@property (retain) NSObject *iAmRetainedWhenProperyIsAssigned; 

: ARC는 관리 메모리이기 때문에, 모든 즉, 보내고 당신이 이전에 코드 또는 속성했을 것이라고했을 【대상 자료] ING [객체가 유지]를하고 있습니다 이제는 ARC를 사용하여 간단한 사용자는 코드에서 또는 속성을 정의 할 때 retain 또는 release와 같은 단어를 사용하지 않습니다. 그러나 우리는 여전히 소프트웨어를 설계합니다. ARC는 똑똑하지만, 우리가 정의하는 관계의 구조적 함의를 추론 할 정도로 똑똑하지 않습니다. 속성이 참조하는 객체에 대한 참조를 클래스가 "소유"한다고 계속 말해야합니다. 어느 가장 기본적인 측면에서 우리를 감소 :

(강한) 특성에 사전 ARC를 의미 (유지) 어떤 아크 의미는 (소유는/유지)

은 (약한) (지정) 무엇을 의미하는 아크 의미 (예 : 소유하지 않았거나 보유하지 않음)

0

마지막 답은 그 플레이어 개체가 메모리에서 어떻게 자유롭게 실행되는지 Xcode 5.1 이전에 어떻게 정의했는지 이해하는 것이 었습니다.

이제는 AVPlayer을 중지하고 superview에서 제거하는 방법에 대한 적절한 대답을 제공해 드리겠습니다. 사실 AVPlayer에서 정지 메소드가 없습니다. 대신 AVPlayer 오브젝트에 의해 위임 된 일시 정지 된 것을 사용해야합니다.

그냥이 코드를 추가

[self.videoPlayer Pause];[self.avPlayerLayer removefromsuperlayer];self.videoPlayer = nil; 
+0

플레이어가 멈 춥니 다. fine.player도 제거됩니다.하지만 내보기 컨트롤러를 무시하면 폴링 오류가 발생합니다.미리 감사드립니다 이유 : 'AVPlayerItem 클래스의 인스턴스 0x7f9e50d72dc0은 키 값 옵저버가 등록되어있는 동안 할당이 해제되었습니다. 현재 관찰 정보 : ( 컨텍스트 : 0x102296318, 속성 : 0x7f9e50d5a350> –

+0

해결책은 객체를 해제하기 전에 옵저버를 제거하십시오. 구성원에 대해 새 객체를 교체하거나 할당하면 이전 객체를 해제하므로 먼저 관찰자를 제거해야합니다. [player removeObserver : self forKeyPath : @ "status "]; –

+0

네가 맞다. –

0

이 솔루션은 개체를 해제하기 전에 관찰자를 제거하는 것이었다. 멤버에 대해 새 객체를 교체하거나 할당하면 이전 객체를 릴리스하므로 먼저 옵저버를 제거해야합니다. [player removeObserver : self forKeyPath : @ "status"]; - Nandan Deshmukh

관련 문제