gpt4 book ai didi

swift2 - Swift 将函数分配给 var 导致保留循环?

转载 作者:行者123 更新时间:2023-12-03 19:54:25 27 4
gpt4 key购买 nike

我在 Swift Memory Management: Storing func in var 遇到了类似的问题但这并没有解决我的问题。

这是我的类定义:

class Test {
var block: (() -> Int)?

func returnInt() -> Int {
return 1
}

deinit {
print("Test deinit")
}
}

我尝试了两种方法来为 block 赋值属性并得到完全不同的结果。第二种方法没有引起retain circle,这很意外:
var t = Test()
// This will lead to retain cycle
// t.block = t.returnInt
// I thought this will also lead to retain cycle but actually didn't
t.block = {
return t.returnInt()
}
t = Test()

在我看来,变量 tblock 捕获而 blockt 的属性(property),那么谁能解释为什么没有保留周期?

最佳答案

在 Swift 中,所有捕获的变量都是通过引用捕获的(在 Apple Blocks 术语中,所有捕获的局部变量都是 __block )。所以t块内部与 t 共享块外;该块不包含 t 的独立副本.

最初,在第二种情况下也有一个保留循环,因为该块持有对 t 的这个共享副本的引用。 , 和 t指向第一个 Test对象,以及 Test对象的 block属性指向块。但是,当您重新分配共享变量时 t (在块的内部和外部都可见),你打破了保留循环,因为 t不再指向第一个 Test目的。

在第一种情况下,t被值(value)有效地捕获,因为 t立即在表达式 t.returnInt 中求值而不是作为块中的变量被捕获。所以重新分配t在块之外之后对块没有影响,并且不会中断保留循环。所以你可以想到

t.block = t.returnInt 

有点像
let tmp = t
t.block = {
return tmp.returnInt()
}

关于swift2 - Swift 将函数分配给 var 导致保留循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35080434/

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