32

내 클래스 중 하나에서 키 - 값 관측을 사용하려고합니다. 관찰자를 init 메서드에 등록하고 dealloc에서 제거/등록 취소하지만 내 디버그 인쇄 결과에 따라 dealloc 메서드가 호출되기 전에 다음과 같은 오류가 발생합니다.옵저버는 언제 제거해야합니까? 옵저버를 제거하기 전에 객체를 할당 해제하는 중 오류가 발생했습니다.

TekkPoint 클래스의 인스턴스 0x583870은 키 값 옵저버가 아직 등록되어있는 동안 할당 해제 중입니다. 관측 정보가 유출되고 다른 개체에 실수로 첨부 될 수 있습니다. NSKVODeallocateBreak에 중단 점을 설정하여 디버거에서 여기서 중단합니다. 다음은 현재 관측 정보입니다 ( 컨텍스트 : 0x0으로, 속성 : 0x536400> 상황 : 0x0으로는, 건물 : 0x55aba0> )

내가 관찰자를 제거해야합니다 특별한 방법이 있나요? 아니면 내가 그들을 제거해야하는 특정 장소?

이 내용에 따르면 question 일을 올바르게하고 있지만 왜이 오류 메시지가 표시됩니까? 여기

내 할당 해제 루틴입니다 : 그건 내 구현에 대한 이상한 수 있습니다주의해야 할

- (void)dealloc { 
    // Remove all observers. 
    for (NSString *path in [TekkPoint observedPaths]) { 
    [self removeObserver:[option_ tChart] 
      forKeyPath:path]; 

    } 

    [description_ release]; 
    [weight_ release]; 
    [super dealloc]; 
} 

한 가지 내가 추가하고 observee에서 관찰자를 제거, 이건 내 문제가 발생할 수 오전입니까?

답변

46

아. 당신은 SomethingElse 객체에서 TekkPoint 개체를 관찰하고, 그리고 SomethingElse 개체가 하나 추가하고, 정확한 관찰자를 제거한다? 그게 정상적인 방법입니다. 명확하게하려고합니다.

관찰중인 SomethingElse이 아직 처리되지 않는 동안 TekkPoint 개체가 할당 해제되는 것처럼 보입니다. 이 해제되고있는 TekkPoint 아닌 SomethingElse이기 때문에 SomethingElse의 dealloc 메소드는 호출되지 않습니다.

당신은 관찰자가 사라지기 전에 사라질 수 있습니다 개체를 관찰에 계획하는 경우에, 당신은 그들의 관찰자를 제거해야 관찰자 통지의 방법이 필요합니다. TekkPointSomethingElse에서도 볼 수있는 alive 속성을 가질 수 있으며 NO으로 설정되면 TekkPoint을 관찰하는 모든 사용자는 자신을 관찰자로 지목합니다.

+1

남자이 답변은 내 생명을 구한 것입니다. 왕 –

+0

간단하고 쉽습니다. +1 – govi

+0

또 다른 옵션은 관찰하는 개체에서 관찰되는 개체에 대한 강력한 참조를 만드는 것입니다. 이렇게하면 관측 대상이 해제 될 때까지 관찰 대상이 해제되지 않습니다. – Avario

2

[super dealloc] 전에 옵저버를 제거 하시겠습니까? super의 dealloc을 너무 일찍 호출하면 이와 같은 오류가 발생할 수 있습니다.

+0

아니에 사과 문서에서

[super dealloc] 

을 부를 것이다. [슈퍼 dealloc] 내 dealloc에서 마지막으로 전화입니다. –

+0

오래된 스레드가 방금 왔어요. 그래, 슈퍼 dealloc 확실히 마지막해야합니다. – Ben

-10

일반적인 코드는 다음과 같이 보입니다 :

- (void) dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 

더블 당신의 dealloc 방법의 서명을 확인을 (목표 C가 매우 용서하고 때 엉망 방법의 이름을 경고하지 않습니다). 예를 들어, 메소드 이름이 "dealoc"(1 개 l) 인 경우 dealloc은 호출되지 않습니다.

그렇지 않으면, 당신의 dealloc의 reoutine을 포함하는 질문을 편집 할 수 있습니다.

+12

키 값 관측과 관련이 없습니다. – rpetrich

+0

이 질문은 KVO를위한 것입니다. 알림 –

0

는 왜 나는 확실히 오른쪽 순서가, 할당 해제

In an implementation of dealloc, do not invoke the superclass’s implementation 
+1

ARC를 사용할 때만 호출 할 필요는 없습니다. 다음 질문 참조 : http://stackoverflow.com/questions/9058428/documentation-about-dealloc –

관련 문제