这里是我的自定义视图:斯威夫特保留周期解释
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