2010-04-29 3 views
0

내 애플리케이션이 닫히면 주 컨트롤러 클래스는 모델에서 Observer로 자체 제거 된 다음 모델을 해제합니다. 이처럼 :KVO는 KVO 관측자가 등록되어 있지 않더라도 (또는 그럴 수 있습니까?)

- (void)dealloc { 
    [theModel removeObserver:self 
        forKeyPath:@"myValue"]; 
    [theModel release]; 
    [super dealloc]; 
} 

그리고 바로 그 후, 디버거는 말한다 :

2010-04-29 14 : 07 : 40.294 MyProgram [13678 : a0f] 인스턴스 클래스 TheModel의 0x116f2e880이 해제 된 동안 핵심 가치 옵저버는 아직 등록되어 있습니다. 관측 정보가 누출되어 다른 물체에 실수로 부착 될 수 있습니다. NSKVODeallocateBreak에 중단 점을 설정하여 디버거에서 여기서 중단합니다.
< NSKeyValueObservationInfo 0x100288450 > (
< NSKeyValueObservance 0x1002aca90 : 관찰자 : 0x116f40ec0, 주요 경로 : myValue, 옵션 : < 새로운 기능 : 여기에 현재 관측 정보입니다 YES, 올드 : NO, 이전 : NO > 컨텍스트 : 0x0으로, 속성 : 0x116f80430 0x116f2e880 실제로 모델이며 0x116f40ec0는 실제로 컨트롤러 >
)

.

컨트롤러가 관찰자로서 스스로 제거되었을 때 어떻게 여전히 관찰자가 될 수 있습니까?

+1

GDB는 그런 말을하지 않습니다. 이것이 프로그램의 콘솔 출력입니다. GDB 출력에는 타임 스탬프, 프로그램 이름, PID 및 스레드 ID가 없습니다. 출력은 KVO 자체에서 발생합니다. 그에 따라 질문 제목을 수정했습니다. –

답변

2

이것은 단지 추측이지만 컨트롤러를 해당 키 경로의 옵저버로 두 번 이상 추가 했습니까? 아마도 다른 옵션이나 컨텍스트가 있을까요? 아니면 다른 객체에 옵저버로 추가 했습니까?하지만 모델 객체로 전달되는 키 경로를 사용 했습니까? 예 : foo가 theModel 프로퍼티를 가지고 있고 컨트롤러를 키 경로 "theModel.myValue"와 함께 foo에 대한 옵저버로 추가했다면.

-addObserver:forKeyPath:options:context:에 중단 점을 넣고 추가 할 내용과시기를 볼 수 있습니까?

+1

'+ keyPathsForValuesAffecting '으로 암시 적으로 추가 된 옵저버를 명시 적으로 제거해야합니까? – bastibe

+0

아니요, 그렇지 않습니다. – ipmcc

관련 문제