문제

Child View가 부모보기에 알림을 보내는 경우가 있습니다. 이제 전화를 걸고 있어요 addObserver: 안에 viewWillAppear: 그리고 removeObserver: 안에 viewWillDisappear:. 그러나 나는 이것이 그 이후로 올바른 것이 아니라고 생각합니다 viewWillAppear: 보기가 새로 고침 될 때 전화.

[[NSNotificationCenter defaultCenter] addObserver: (id)observer selector: (SEL)aSelector name: (NSString *)aName object: (id)anObject];

[[NSNotificationCenter defaultCenter] removeObserver: (id)observer name: (NSString *)aName object: (id)anObject];

감사.

도움이 되었습니까?

해결책

사실, 이것은 나쁜 생각입니다. 메모리가 낮아지면보기 컨트롤러가 메모리 경고를 전송할 수 있습니다. 이 인스턴스의 기본 동작은보기를 지우는 것입니다 (현재 화면에없는 경우). 이 경우 ViewDidload 메시지가 두 번째로 보낼 수 있습니다 (메모리 이벤트 후, 내비게이션 컨트롤러에 의해 뷰가 화면에 다시 표시 될 때.) 따라서 동일한 객체에 대한 두 번의 등록이 있지만 한 번만 제거됩니다. (거래소에서)

더 나은 솔루션은 등록했다는 깃발을 설정하거나 Init Method에 등록하는 것입니다.

다른 팁

알림을 등록 할 올바른 위치는 viewDidLoad 동일한 알림에 대해 등록 해제하는 방법 및 올바른 위치는 다음과 같습니다. dealloc 방법.

벤의 옳은 - 그러나 나는 잠재적으로 깨지기 쉬운 길을 찾았습니다. 나는 영원히 "... 주요 가치 관찰자가 여전히 등록 된 동안 거래되었다"고 영원히 얻었 기 때문에 이것을 발견했다.

왜 그런지 모르겠습니다. 그러나 init 메소드에 AddObserver가 있었을 때 DealLoc 방법에서 removeObserver를 사용했습니다. 여전히 KVO가 여전히 메시지를 받고 있습니다. 나는 내 removeObserver가 올바르게 부름을 통과하고 확인했다.

AddObserver를 대신 ViewDidload 메소드로 옮겼습니다.

ViewDidunload에 RemoveObserver를 남겼습니다 그리고 거래에서; 그러나 나는 그것이 균형이 맞지 않기 때문에 그것을 좋아하지 않습니다. 그러나 정상적인 상황에서는 내 ViewDidunLoad가 호출되지 않습니다. 이것은 메모리 알림이 낮은 경우에만 보호입니다.

그러나 메모리 이벤트가 낮은 상황에 빠질 수 있습니다. ViewDidunLoad가 호출됩니다. 그런 다음 그 후 언젠가 Dealloc을 쳤다면 (ViewDidload를 다시 누르기 전에) RemoveObserver를 두 번 호출합니다!

그래서, 나는 그것을 내 ViewDidload와 내 거래에 보관할 것이라고 생각합니다.

나는 아직도 내 init 메소드에서 addobserver를 수행하면 왜 그것이 제대로 작동하지 않는지 모르겠습니다.

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