2016-09-23 2 views
4

iOS 9의 this 게시물을 읽은 후에 더 이상 removeObserver를 필요가 없다는 것을 알고 있습니다.왜 ios8에서 옵저버를 제거해야합니까?

그러나 아이폰 OS 8, 당신 needed의 ViewController의 deinit 방법 removeObserver합니다. 그러나 나는 그것을 이해할 수 없다. viewController가 할당 해제되면 DEAD가 해제됩니까? 왜 우리는 removeObserver를 할 필요가 있는가? 그것은 관찰자이기 때문에 결코 전화를받지 않을 죽은 사람에게 전화하는 것과 같습니다.

무엇을 이해하지 못합니까?

그것은 완전히 당신이 링크 된 문서에서 설명 된 것
+3

할당 취소 된 인스턴스로 메시지를 보내면 앱이 다운되기 때문에 ... –

답변

9

:

알림 센터는 이제 관찰자에 영점 조정 참조 유지 :

관찰자가 할 수있는 경우

는 영점 - 약한 참조로 저장하기를 객체가 약하게 저장할 수없는 경우 (즉, 런타임에서 객체를 약하게 저장할 수 없도록하는 사용자 정의 보유/해제 메커니즘이있는 경우) 기본 저장소는 옵저버를 0으로 설정하는 약한 참조로 저장합니다. 비 weak 제로 참조. 아이폰 OS 9

이전 NSNotificationCenter 그래서 NSNotificationCenter 대상이 해제되었다 모르는 weak 참조를 사용하여 구현되지 않았습니다. 그것은 맹목적으로 등록 된 모든 대상에게 알림을 보냈습니다. 대상이 할당 취소 된 경우 이는 좋지 않습니다 (충돌 가능성이 있음). 따라서 항상 등록을 취소해야합니다.

iOS 9에서 약한 참조를 사용하여 NSNotificationCenter이 시작되었습니다. 즉, 등록 된 대상 중 하나가 할당 취소되었는지 여부를 알 수 있습니다. 즉, 더 이상 할당 해제 된 대상에게 알림을 보내려고하지 않습니다. 그리고 이것은 더 이상 할당 해제되기 전에 명시 적으로 타겟을 등록 해제 할 필요가 없다는 것을 의미합니다.

4

그것은 관찰자 인 훨씬

정확히 전화를 받아 결코 죽은 사람을 호출처럼!

이 경우 사용자의 전화 번호는 알림 센터에서 관찰자를 호출하려고 시도 할 때 참조 해제되는 메모리 주소입니다. 이제 View Controller가 할당 해제 된 후이 메모리 주소에 무엇이있을 것으로 예상됩니까? 우리는 알 수 없다.

하지만 더 이상 존재하지 않거나 완전히 다른 무언가 (예를 들어 이미지)로 대체 된 객체에 대해 메소드 (즉, 통지 센터가하는 것)를 호출하고 싶지는 않습니다.

실세계의 예를 추가하려면 자동차 (보기 컨트롤러)가 차고의 특정 위치 (메모리 주소)에있는 것보다 더 낫습니다. 당신은 절대 거기에 있기 위해 당신의 차에 의지한다. 그래서 당신이 들어 오기를 원할 때 거기에 있는지조차 알지 못한다. 누군가 당신 차를 제거 (할당 해제) 한 것처럼 가장하면서, 당신은 여전히 ​​거기에 의지한다. 더 이상 존재하지 않는 차에 들어가서 앉아있는 것은 분명히 괴로운 경험 일 것입니다.

관련 문제