每个控制器的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