gpt4 book ai didi

swift - 为什么这不会导致 Swift 中的保留循环?

转载 作者:搜寻专家 更新时间:2023-11-01 06:41:17 25 4
gpt4 key购买 nike

class Person {
var hello : (() -> Void)?
var name = "name"

init() {
print("init \(self)")
}

deinit {
print("deinit \(self)")
}
}

var person : Person!

person = Person()
person.hello = { () -> Void in
print("\(person.name)")
}
person = nil

控制台输出为:

init Person
deinit Person

在我看来,因为“person”是可选的,所以 Swift 在“hello”闭包中保留了一个弱引用,对吗?

最佳答案

你没有得到一个保留周期,因为 hello 闭包正在捕获一个变量,而不是一个常量,并且因为预计变量将来会改变,它不会保留它,它只包含对它的引用。

将其转换为常量,您将获得预期的保留周期:

func test() {
let html = Person()
html.hello = { () -> Void in
print("\(html.name)")
}
}
test()

这只打印 init Person,尽管当函数结束时,html 超出范围并且应该被释放。

如果您将变量定义为 __block,则该行为等同于 Objective-C

关于swift - 为什么这不会导致 Swift 中的保留循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34937429/

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