2017-10-05 7 views
0

Swift 클래스가 있다고 가정 해보십시오. 신속 구조의 NotificationCenter 관찰자를 제거하기위한 가장 좋은 장소

class Test { 
    init() { 
     NotificationCenter.default.addObserver(...) 
    } 

    deinit { 
     NotificationCenter.default.removeObserver(self) 
    } 
} 

클래스에서는 NotificationCenter 관찰자를 제거 deinit 수명주기 방법을 사용할 수 있습니다. 구조체에는 deinit 메서드가 없습니다. 내 질문은 그러므로, 어디에서 사람이 구조체에서 NotificationCenter 관찰자를 제거하겠습니까? 또는 구조체에서 관찰자를 제거 할 필요가 없습니까? 그들은 자동을 제거 할 때

아이폰 OS 9에서
+0

클래스에 대한 참조를 유지할 수 있습니다. 클래스에서'dealloc'이 호출되면 구조체가 할당 해제되었음을 알 수 있습니다. – JAL

답변

3

이상, 그것은 NotificationCenter 관찰자를 제거 필요하지 을합니다.

어쨌든 메모리에서 멈추는 것이 염려되는 경우 구조체를 처리하는 클래스에서 제거 작업을 호출해야합니다.

0

구조체를 NotificationCenter에서 관찰자로 등록 할 수 없습니다. addObserver(_:selector:name:object:) 메서드를 사용할 때는 Selector을 매개 변수로 전달해야합니다. 선택기는 @objc으로 표시된 함수 여야하며 클래스에서만 사용할 수 있습니다.

수업에 관해서는 질문에서 언급 한 것처럼 deinit 방법으로 관찰자를 등록 취소 할 수 있습니다. 그러나 iOS 9부터는 수동으로 옵저버를 제거 할 필요가 없습니다.이 릴리스 이후 옵저버에 대한 약한 참조가 NSNotificationCenter에 저장되어 있기 때문입니다. 관찰자 제거는 자동으로 수행되지 않습니다.

release notes에 따르면.

NSNotificationCenter 및 NSDistributedNotificationCenter는 더 이상 할당 해제 될 수있는 등록 된 관찰자에게 알림을 보내지 않습니다. 옵저버가 제로 - 약한 참조로서 저장 될 수있는 경우, 기본 스토리지는 관찰자를 제로 약한 참조로 저장합니다. 또는 런타임에 약하게 객체를 저장할 수 없도록하는 사용자 정의 보유/해제 메커니즘이 있기 때문에 객체를 약하게 저장할 수없는 경우 객체는 비 weak 영점 조정 참조로 저장됩니다. 이는 관찰자가 할당 해제 방법에서 등록을 취소 할 필요가 없다는 것을 의미합니다.