gpt4 book ai didi

ios - 这些闭包中的保留周期有什么区别?标准闭包与对象初始化闭包

转载 作者:行者123 更新时间:2023-11-28 07:44:59 25 4
gpt4 key购买 nike

我理解在闭包中引用 self 时典型的闭包保留循环,但是标签不产生保留循环的原因是什么?我已经测试过评论 testClosure 与评论标签,只有 testClosure 产生了一个保留周期

class TargetView: UIView {

let newText = "hi"
var label = UILabel()

private var counter = 0
private var testClosure : (() -> ()) = { }

init() {
super.init(frame: .zero)
// This causes a retain cycle
testClosure = {
self.counter += 1
print(self.counter)
}

// This does NOT cause a retain cycle
label = UILabel() {
$0.text = self.newText
self.counter += 1
}
}

required init?(coder aDecoder: NSCoder) { fatalError() }

deinit {
print("view deinit!")
}
}

extension UILabel {
convenience init(label: (UILabel) -> Void) {
self.init()
label(self)
}
}

最佳答案

如评论中所述:UILabel 的自定义初始化程序仅运行 label block 但不存储(阅读:不保留) 它,因此不会发生保留循环。

请注意,从外部您无法确定是否保留了 block 参数,因此除非记录了此行为或您自己编写了代码,否则通常最好使用弱引用来确定。

关于ios - 这些闭包中的保留周期有什么区别?标准闭包与对象初始化闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51332960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com