這裏是我的自定義視圖:斯威夫特保留週期解釋
class CustomVIew: UIView {
deinit {
print("custom view deinit")
}
var onTapViewHandler: (()->Void)?
}
和視圖控制器:
class ViewControllerB: UIViewController {
var customView: CustomVIew!
deinit {
print("B deinit")
}
override func viewDidLoad() {
super.viewDidLoad()
let customView = CustomVIew()
customView.onTapViewHandler = { [unowned self] in
self.didTapBlue()
}
customView.frame = CGRect(x: 50, y: 250, width: 200, height: 100)
customView.backgroundColor = UIColor.blueColor()
view.addSubview(customView)
self.customView = customView
}
func didTapBlue() {
}
}
當控制器從導航堆棧中彈出,一切都很好:
B deinit
custom view deinit
但是當我替換此代碼時:
customView.onTapViewHandler = { [unowned self] in
self.didTapBlue()
}
與此:
customView.onTapViewHandler = didTapBlue
那麼,沒有打印在控制檯上。 CustomView和ViewController沒有發佈,爲什麼?
爲什麼customView.onTapViewHandler = didTapBlue
捕獲對self
的引用?
你知道爲什麼已經不是嗎?你的標題說它是保留圈...通過打印檢查引用計數:print(CFGetRetainCount(object)) – Surely
@你確實建議'CFGetRetainCount'來解決'retain'的問題。但有一個原因,保留'已被棄用:這不是一個好的解決方案。 – Abizern
這只是一種檢查方法。我的意思是你可以輸出視圖控制器被引用的引用數量,以便你知道「customView」是否對視圖控制器有很強的參考。如果有,則有一個保留週期。因爲它有一個保留週期,所以這兩個對象不能自動銷燬。 – Surely