gpt4 book ai didi

ios - Swift,为什么类方法不需要闭包列表

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

如果函数本质上是闭包。为什么类的方法在闭包中引用自身或另一个实例属性时不需要闭包列表。

背后是否有一个【无主的自己】?例如:

class MyClass{
func myFunc(){
self.otherFunc()
}

func otherFunc(){
print()
}
}

myFunc 中不会有引用循环吗?即,闭包指向自身,而实例指向函数。两者都无法解除分配。

最佳答案

“如果函数本质上是闭包。”这不是真的。函数(和方法)与闭包不同。函数的所有自由变量都是未绑定(bind)的。闭包绑定(bind)了它们的部分或全部自由变量(对它们关闭,这就是名称“闭包”的来源)。

“自由变量”是在函数范围之外定义的任何变量(包括其形式参数)。顶层函数 func f(x: Int) 有一个自由变量;当你调用它时,你必须传递一个参数。像 { f(1) } 这样的闭包没有自由变量。调用它时,不传递任何参数。

方法和函数一样,不捕获任何东西。它在执行时会传递所有自由变量。例如,当您调用 object.doThis() 时,这与调用 Type.doThis(object)() 相同。

class X {
func doThis() {}
}

let x = X()
x.doThis()

X.doThis(x)() // Same thing

X.doThis(x) 是一个返回函数的函数。这里没有魔法。在调用期间提供所有自由变量。什么都没有被捕获。 (在您描述的情况下,“自由变量”是 self,但这不会改变任何东西。self 并不特别,除了它有一些语法糖它。)

这与闭包不同:

let c = { x.doThis() }
c()

当我调用c() 时,它如何知道x 的值?我可能已经返回了 c 并且 x 现在可能超出了范围。系统必须跟踪 x(包括进行强引用以使其不会解除分配),它通过捕获它或“关闭 x”来做到这一点,这会增加保留循环的可能性.所以在c中,x是绑定(bind)的。它不是免费的。调用 c() 时不能传递它。

self 在这里并不特殊。这只是另一个变量。闭包中的 [weak self] 也不是特别的。您也可以编写 [weak x][...] 语法只是捕获列表。

关于ios - Swift,为什么类方法不需要闭包列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50243148/

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