iOS9之前
對于普通的添加觀察者的方法
NotificationCenter.default.addObserver(self, selector: #selector(doSth(note:)), name: NSNotification.Name(rawValue: "ddd"), object: nil)
需要手動移除觀察者self缚够,因為iOS9之前NotificationCenter.default對self是unsafe_unretained引用,當(dāng)self釋放后鹦赎,NotificationCenter.default持有的self并不會自動置為nil谍椅,而變成了一個野指針,這樣再給self發(fā)送通知的話就會造成崩潰(給野指針發(fā)送消息)古话。
iOS9之后
對于普通的添加觀察者的方法不需要手動移除觀察者self雏吭,因為iOS9之后NotificationCenter.default對self是weak引用,當(dāng)self釋放后陪踩,NotificationCenter.default持有的self會自動置為nil杖们,而給一個nil發(fā)送推送的時候是不會發(fā)生崩潰的。
使用selector方式添加觀察者
iOS9之前需要手動移除觀察者self肩狂,iOS9之后不需要手動移動觀察者self摘完。
使用閉包方式添加觀察者
observation = NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "ddd"), object: nil, queue: .main) { (note) in
print("不能捕獲self,全局變量NotificationCenter.default對self進行了強引用")
}
不管是iOS9之前還是iOS9之后我們都需要手動移除觀察者傻谁,因為使用這種方式NotificationCenter.default對觀察者進行的是強引用孝治。
注意:
1.添加的觀察者不是self,而是該方法返回的一個觀察者,所以移除的時候要移除這個返回的觀察者荆秦,否者即使當(dāng)前self銷毀了篱竭,該觀察者還存在(被NotificationCenter強引用),在收到該通知后還會執(zhí)行相應(yīng)的方法步绸。(swift中使用rxSwift就不用我們再手動移除該觀察者了)
deinit {
print("被銷毀了...")
NotificationCenter.default.removeObserver(observation as Any)
}
2.該方法會對self進行強引用掺逼,所以不要在block中直接使用self,否則會造成self無法釋放瓤介,需要先對self進行弱引用再使用吕喘。