25142


おはようございます。

iOSのMVCモデルを勉強しているときに、「Modelクラスへのオブサーバーをaddしたらremoveするものだ」というのを知りました。  
そこで思ったのですが、同じobserverでもNSNotificationCenterを使ったアクティブ化、非アクティブ化の通知のとき（AppDelegate内に発信元を記載）には、removeObserverしているサンプル例をまだ見たことがありません。  
これはそのようなサンプルが上がっていないだけで、実際はremoveするべきものなのでしょうか？それともそういう仕様なのでしょうか？  
よろしくお願いいたします

* * *
[code]

    func applicationWillResignActive(application: UIApplication) {
        NSNotificationCenter.defaultCenter().postNotificationName("applicationWillResig‌​nActive", object: nil)
    }
    
    func applicationDidBecomeActive(application: UIApplication) {
        NSNotificationCenter.defaultCenter().postNotificationName("applicationDidBecome‌​Active", object: nil)
    }
    
[/code]

という通知をつけています。


CC BY-SA 3.0
2016-05-22T23:57:31.163
25087
2016-05-24T12:39:11.740
2016-05-24T11:54:50.137
5337
15418
question
swift xcode
NSNotificationCenterのremoveObserverについて


こちらに回答がありました。  
<https://stackoverflow.com/questions/13911651/in-arc-do-we-need-to-send-
removeobserver-explicitly>

Appleのドキュメントには必要だと書いてありますね。

>
[code]

>     func addObserver(_ observer: AnyObject,
>             selector aSelector: Selector,
>                 name aName: String?,
>               object anObject: AnyObject?)
>     Be sure to invoke removeObserver:name:object: before
> notificationObserver or any object specified in
>  
[/code]

>
> addObserver:selector:name:object: is deallocated.

OSX 10.11以上ではremoveしなくても良くなったようです。


CC BY-SA 3.0
2016-05-24T11:32:27.553
25140
2016-05-24T11:32:27.553
2017-05-23T12:38:55.250
-1
8601
25087
answer


[Foundation Release Notes for OS X v10.11 and iOS
9](https://developer.apple.com/library/mac/releasenotes/Foundation/RN-
Foundation/index.html)より、

> In OS X 10.11 and iOS 9.0 NSNotificationCenter and
> NSDistributedNotificationCenter will no longer send notifications to
> registered observers that may be deallocated.  
>  If the observer is able to be stored as a zeroing-weak reference the
> underlying storage will store the observer as a zeroing weak reference,
> alternatively if the object cannot be stored weakly (i.e. it has a custom
> retain/release mechanism that would prevent the runtime from being able to
> store the object weakly) it will store the object as a non-weak zeroing
> reference.

OSX v10.11 / iOS9
より、`NSNotificationCenter`は`addObserver()`で受け取ったオブザーバを`weak`で参照するように修正されたので、ARCで管理されているオブジェクトに通知したい場合には、明示的に`removeObserver()`を呼ぶ必要はなくなりました。

逆に言えば、iOS8以前をサポートするのであれば、`deinit()`などのタイミングで`removeObserver()`をコールする必要があります。


CC BY-SA 3.0
2016-05-24T12:39:11.740
25142
2016-05-24T12:39:11.740
5337
25087
answer