2010-07-07 1 views
5

먼저 -removeObserver:을 사용하고 동일한 이름으로 -addObserver:을 호출해도 되나요? 또는 -addObserver:이 먼저 -removeObserver: 앞에 오기위한 규칙입니까?addobserver/removeobserver query

OS 4.0을 사용해 보았는데 문제가없는 것 같습니다 (충돌, 경고 등 ...).

-(void) setObserver 
{ 
[[NSNotificationCenter defaultCenter] removeObserver:self 
               name:OBSERVER_NAME object:nil]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector: @selector(selectorName) 
              name:OBSERVER_NAME 
              object:nil]; 
} 

이유는 동일한 방법 selectorName이 경우 -setObserver 방법 다시라는 것을 상정 회 호출되고 두 관측을 방지하는 그 내부 -viewDidLoad 및 메모리 경고가 발행되었다.

또한 -dealloc 동안 -removeObserver:을 호출해야합니까?

+0

+1 좋은 질문입니다. 이전에 등록되지 않은 Observer를 제거하는 것이 아니라면 알 수 없지만 할당 해제 전에 Observer를 제거해야한다는 것을 알고 있습니다. 주어진 경우에 대해 viewDidUnload에서 관찰자를 제거 할 수도 있습니다. 이것이이 메소드의 목적입니다 : loadView와 viewDidLoad에서 이루어진 모든 호출의 균형을 맞추십시오. – tonklon

답변

3

-selectorName이 두 번 호출되는 경우 코드에 다른 문제가있을 수 있습니다. 코코아가 아직 추가하지 않은 옵저버를 제거하는 것에 대해 우아 할지라도, 실제로 그렇게하지는 않을 것입니다.

사용자 tonklon이 (가) 의견에서 말하면 사용자는 아마도 -viewDidUnload의 옵저버를 제거해야합니다. 마지막 질문에 대해서는 옵저버를 -dealloc으로 제거하는 것도 합리적입니다. 옵저버 제거와 같은 작업이 메모리 관리의 부작용이 아닌 결정적 시간에 발생하도록 코드를 구조화하는 것이 좋습니다.