2013-04-18 5 views
1

reference에서 Null Observer 포인터를 사용하여 관찰자를 알림에 등록하는 것이 가능하다는 것을 알았습니다. 그러나 두 가지 제거 방법 모두 NULL이 아닌 유효한 포인터 값이 필요합니다. 등록 없이도이를 어떻게 극복 할 수 있습니까?CFNotificationCenterRemoveObserver observer

또한이 답변 예에서 알 수 있습니다. CFNotificationCenter usage examples? 제거는 NULL로 수행되지만 참조에 따르면 다시 잘못된 것입니다.

그렇다면 NULL 관측자를 사용한 등록을 제거하는 올바른 방법은 무엇입니까? 그들은 제거되지 않아야합니까 (응용 프로그램 종료로 인해 메모리가 지워질 때까지 계속 남아 있습니다) ??

설명은 대단히 감사합니다!

답변

2

관찰자를 보내는 것은 실제 벌칙이 없습니다 (이는 void *이며 시스템에 의해 해석되지 않습니다). 선호하는 사용 사례는 관찰자를 제거하려는 경우 을 초기 CFNotificationCenterAddObserver 호출과 그 이후의 CFNotificationCenterRemoveObserver 호출 모두에 보내야한다는 것입니다.

예를 들어 Add와 Remove 모두에 NULL을 전달하는 것이 실제로 작동하지만 API 계약을 위반한다고 지적하면 배송 코드에 사용하지 말라고 제안합니다.

observer 자체는 종종 문자열 포인터이며 동일한 포인터를 전달하는 한 괜찮습니다.

char *myObserver="anObserver"; 

CFNotificationCenterAddObserver (notificationCenter, (void*)myObserver, myCallback, NULL, NULL, CFNotificationSuspensionBehaviorDrop); 

이상 :

CFNotificationCenterRemoveObserver (notificationCenter, (void*)myObserver, NULL, NULL); 

재단 만 void*의 평등을 확인한다 된대로 같은 문자열 포인터뿐만 아니라 같은 문자열을 사용하십시오, 그것은 대해 아무것도 몰라 내용.

이 설명의 이유는 하나의 콜백을 사용하여 여러 명의 관찰자를 처리 할 수 ​​있기 때문입니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 나는 여전히 제거 할 수없는 널 관찰자의 배경에 대한 논리를 이해하지 못하고있다. 널 관찰자를 등록하는 다른 개발자가 작성한 코드가 있습니다. 나는 할당 된 하나를 추가 할 수 없으며, 지금이 때문에 통지가 제거 된 곳이 없습니다. – NightRider

+0

여기에서 이해하기 어려운 것이 확실하지 않습니다. NULL 옵저버를 등록하면 기본적으로 응용 프로그램이 종료 될 때까지 제거 할 수 없게됩니다. NULL은 받아 들여지지 만 권고하지 않습니다. "할당 된 것을 추가 할 수 없습니다"라는 의미는 무엇입니까? – gaige

+0

나는 사과의 논리를 제외하고는 그것을 완전히 이해한다. 그리고 할당 된 코드를 추가 할 수 없기 때문에 코드를 변경할 수 없습니다. 말한대로 알림은 응용 프로그램이 종료 될 때까지 거기에 남아 있습니다. 다시 한 번 고마워, 나는 너의 대답을 받아 들일거야 :) – NightRider