ARC 아래의 물체에서 관찰자를 어떻게 제거 합니까? 관찰자를 추가하고 제거하는 것을 잊었습니까? 더 이상 수동으로 메모리를 관리하지 않으면 관찰에서 물러나야할까요?
예를 들어, 뷰 컨트롤러에서 :
[self.view addObserver:self
forKeyPath:@"self.frame"
options:NSKeyValueObservingOptionNew
context:nil];
이전 removeObserver:
에는 뷰 컨트롤러의 dealloc
메서드를 호출 했습니다 .
답변
-dealloc
키 값의 관찰을 제거하기에 적절한 장소 인 ARC에서 여전히 구현할 수 있습니다 . [super dealloc]
더 이상이 메서드 내에서 호출하지 않습니다 .
-release
이전 에 재정의했다면 잘못된 방식으로 일을하고있는 것입니다.
답변
이 코드로 수행
- (void)dealloc
{
@try{
[self.uAvatarImage removeObserver:self forKeyPath:@"image" context:nil];
} @catch(id anException) {
//do nothing, obviously it wasn't attached because an exception was thrown
}
}
답변
스택 오버플로의 다른 곳 에서 Chris Hanson은이 목적을 위해 finalize 메서드를 사용하고 소유자가 개체가 완료되었음을 알릴 수 있도록 별도의 무효화 메서드를 구현할 것을 권장합니다. 과거에 저는 Hanson의 솔루션이 잘 고려되어 있다는 것을 알았으므로 그와 함께 할 것입니다.