2

NSNotificationCenter에서 옵저버를 추가 및 제거하는 가장 좋은 방법은 무엇입니까? viewDidLoad에서 관찰자로 self을 추가하고 viewDidUnloadself을 제거하면 내가 궁금하네요NSNotificationCenter에서 관찰자를 추가/제거하는 모범 사례

충분하다. 또는 selfdealloc에서 삭제해야합니다.

아마도 낮은 메모리 조건을 고려해야합니다. viewDidLoad을 추가하고 dealloc을 제거하는 것이 문제가 될 수 있음 : viewDidUnload이 메모리 부족으로 인해 호출 됨 ... viewDidLoad이 뷰가 다시 표시되면 호출 됨 ... 이제 self이 제거되지 않고 두 번 관찰자로 추가되었습니다. (dealloc이 (가) 호출되지 않았기 때문에).

참고 : 여기서는 selfUIViewController 하위 클래스를 나타냅니다.

답변

8

보통 UIViewController 관찰자는 viewWillAppear에 등록하고 내 제거는 viewWillDisappear에 등록합니다.

viewWillDisappear은 5.0 이전 아이폰 OS 버전에서 메모리 부족 상황에서 호출되는 후자의 방법부터 viewWillUnload 것보다 나에게 더 안전한 선택처럼 보인다.

아마도 가장 적절한 대답은보기 컨트롤러가 수행하는 작업에 따라 달라집니다. 보기가 표시되기 전에 알림을 받고 (그리고 이에 대한 반응이 필요합니까?) 기대하십니까? 그렇다면 viewDidLoad에 옵서버를 추가하는 것이 좋습니다.

+0

흥미 롭습니다. 그래서 iOS 5+에서 메모리 부족 상태에서 viewDidUnload 대신 호출되는 것은 무엇입니까? – SundayMonday

+1

메모리 부족 상태 인 경우'didReceiveMemoryWarning'이 계속 호출됩니다. 또한 Apple의 [UIViewController] (http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html) (특히 "Memory Management"섹션 참조)를 확인하십시오. 메모리 부족 경고가 발생하면 UIViewController 클래스는 나중에 다시로드하거나 다시 만들 수 있음을 알고 있으면 뷰를 제거합니다. 이 경우 viewDidUnload 메소드를 호출하여 뷰 계층과 관련된 모든 객체의 소유권을 양도 할 기회를 코드에 부여 할 수도 있습니다. –

5
iOS 용

- 9과 OS X 10.11+가의 WWDC 2015 session 202 "What's New in Cocoa" 발표 :

NSNotificationCenter를
할당 해제 관계자는

let center = NSNotificationCenter.defaultCenter() 
center.addObserver(self, 
        selector: "localeChanged:", 
        name: NSCurrentLocaleDidChangeNotification, 
        object: nil) 

이 필요 호출하지 자동 등록됩니다

let center = NSNotificationCenter.defaultCenter() 
center.removeObserver(self, 
         name: NSCurrentLocaleDidChangeNotification, 
         object: nil) 

참조 : 33:27 비디오, pdf 슬라이드 241