每個控制器的dealloc
方法裏面完成,這是剛剛放鬆正常人一樣,讓正常的釋放過程中去除觀察員你的最簡單方法。但要做到這一點,您必須確保您沒有強大的參考週期。
讓我們假設您有一位觀察者在內存壓力下清空緩存。如果你想刪除的觀察者當對象被釋放,你會使用unowned self
參考:
let cache = NSCache()
var observer: NSObjectProtocol!
override func viewDidLoad() {
super.viewDidLoad()
observer = NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationDidReceiveMemoryWarningNotification, object: nil, queue: nil) { [unowned self] notification in
self.cache.removeAllObjects()
}
}
然後,你可以安全地刪除觀察員deinit
無懼很強的參考週期:
deinit {
NSNotificationCenter.defaultCenter().removeObserver(observer)
}
您沒有分享您正在觀察的內容,但它說明了這個想法:通過在提供給addObserverForName
的閉包中使用[unowned self]
來打破強參考週期。有關weak
和unowned
引用self
的更多信息,請參閱Resolving Strong Reference Cycles for Closures的Swift編程語言。
來源
2015-04-07 03:58:43
Rob
@Rob是「addObserverForName」,最後有一個閉包被認爲是基於塊的觀察者? – TIMEX