Cocoa에서 할당을 취소할 때 KVO 알림 수신에서 개체를 제거해야 합니까?

StackOverflow https://stackoverflow.com/questions/13927

  •  08-06-2019
  •  | 
  •  

문제

객체를 등록했을 때 다른 개체로부터 KVO 알림을 받으려면 술집 (addObserver:... 사용) 그런 다음 할당을 취소하면 내가 이메일을 보내야 해? removeObserver:forKeyPath: 메시지를 보내다 술집 -dealloc에서?

도움이 되었습니까?

해결책

당신은 사용해야합니다 -removeObserver:forKeyPath: 관찰자를 먼저 제거하려면 -[NSObject dealloc] 실행됩니다. 예, 지금 하는 중입니다. -dealloc 수업 방법이 효과가 있을 것입니다.

하지만 그보다 더 나은 것은 관찰을 수행하는 객체를 소유한 것이 무엇이든 그것이 완료되었음을 알 수 있고 (결국) 할당이 취소될 결정적인 지점을 갖는 것입니다.이렇게 하면 관찰을 수행하는 작업이 실제로 할당 해제된 시점에 관계없이 더 이상 필요하지 않을 때 즉시 관찰을 중지할 수 있습니다.

Cocoa에 있는 객체의 수명은 일부 사람들이 생각하는 것만큼 결정적이지 않기 때문에 이를 명심하는 것이 중요합니다.다양한 Mac OS X 프레임워크 자체 ~ 할 것이다 물건을 보내세요 -retain 그리고 -autorelease, 당신이 생각하는 것 이상으로 수명을 연장합니다.

게다가 Objective-C 가비지 수집으로 전환하면 다음과 같은 사실을 알게 될 것입니다. -finalize 이전과는 매우 다른 시간, 매우 다른 맥락에서 실행될 것입니다. -dealloc 했다.우선, 마무리는 다른 스레드에서 이루어지므로 실제로는 캔트 안전하게 보내세요 -removeObserver:forKeyPath: 다른 개체에 -finalize 방법.

메모리(및 기타 부족한 리소스) 관리에 충실 -dealloc 그리고 -finalize, 별도의 -invalidate 소유자가 결정적인 지점에서 작업이 완료되었음을 객체에 알리도록 하는 방법입니다.거기에서 KVO 관찰을 제거하는 등의 작업을 수행합니다.코드의 의도가 더 명확해지고 처리해야 할 미묘한 버그가 줄어듭니다.

다른 팁

고통스러운 경험을 통해 얻은 약간의 추가 정보:NSNotificationCenter는 가비지 수집 하에서 실행될 때 제로화 약한 참조를 사용하지만 KVO는 그렇지 않습니다.따라서 GC를 사용할 때 NSNotificationCenter 관찰자를 제거하지 않고도 문제를 해결할 수 있지만(보유/해제를 사용할 때 여전히 관찰자를 제거해야 함) Chris가 설명하는 것처럼 KVO 관찰자를 제거해야 합니다.

"-dealloc 및 -finalize...에서 메모리(및 기타 부족한 리소스) 관리를 고수하라"는 의견에 Chris의 의견에 확실히 동의합니다.사람들이 할당 해제 기능에서 NSTimer 개체를 무효화하려고 시도하는 것을 여러 번 볼 수 있습니다.문제는 NSTimer가 목표를 유지한다는 것입니다.따라서 해당 NSTimer의 대상이 자체인 경우 dealloc은 호출되지 않아 잠재적으로 불쾌한 메모리 누수가 발생합니다.

무효화 -invalidate 다른 메모리 정리 작업을 수행하세요. dealloc 그리고 finalize.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top