前言:
strong
:當你聲明一個屬性時,它默認就是強引用
weak
:弱引用對象的引用計數不會+1, 必須爲可選類型變量
在聲明弱引用對象是必須用var
關鍵字, 不能用let
.
因爲弱引用變量在沒有被強引用的條件下會變爲nil, 而let常量在運行的時候不能被改變.
deinit {
//移除監聽
NotificationCenter.default.removeObserver(self)
}
這個種情況
1.當前頁面是否存在delegate
var delegate:ZQStarReteViewDelegate?//這種是錯誤的寫法
weak open var delegate:ZQStarReteViewDelegate?
2.方法體中是否用到了self
在swift中 有特殊的寫法 [weak self]
loadData { [weak self] (dataString) -> () in
//以後在閉包中中 使用self 都是若引用的
print("\(dataString) \(self?.view)")
}
或者
weak var weakSelf = self
loadData { (dataString) -> () in
print("\(dataString) \(weakSelf?.view)")
}
這種問題又多出現在RX 的監聽事件中
//監聽鍵盤彈出通知
_ = NotificationCenter.default.rx
.notification(NSNotification.Name.UIKeyboardWillShow)
.takeUntil(self.rx.deallocated) //頁面銷燬自動移除通知監聽
.subscribe(onNext: { _ in
print("鍵盤出現了")
})
//監聽鍵盤隱藏通知
_ = NotificationCenter.default.rx
.notification(NSNotification.Name.UIKeyboardWillHide)
.takeUntil(self.rx.deallocated) //頁面銷燬自動移除通知監聽
.subscribe(onNext: { _ in
print("鍵盤消失了")
})
//這裏要注意這就是一個坑,這裏面就寫一個打印事件,事件定是會被移除。但是這種一旦寫入 如
//監聽鍵盤隱藏通知
_ = NotificationCenter.default.rx
.notification(NSNotification.Name.UIKeyboardWillHide)
.takeUntil(self.rx.deallocated) //頁面銷燬自動移除通知監聽
.subscribe(onNext: { _ in
print("鍵盤消失了")
self.text_name = "張三"
})
這個事件就不會被移除
此時應該
1. _ = NotificationCenter.default.rx
.notification(NSNotification.Name.UIKeyboardWillHide)
.takeUntil(self.rx.deallocated) //頁面銷燬自動移除通知監聽
.subscribe(onNext: {[weak self] _ in
print("鍵盤消失了")
self?.text_name = "張三"
})
2.
weak var weakSelf = self
_ = NotificationCenter.default.rx
.notification(NSNotification.Name.UIKeyboardWillHide)
.takeUntil(self.rx.deallocated) //頁面銷燬自動移除通知監聽
.subscribe(onNext: { _ in
print("鍵盤消失了")
weakSelf?.text_name = "張三"
})