如果函数本质上是闭包。当在闭包内引用self或另一个实例属性时,为什么类的方法不需要闭包列表。
幕后有[无名的自我]吗?例如:
class MyClass{
func myFunc(){
self.otherFunc()
}
func otherFunc(){
print()
}
}
myFunc中没有参考周期吗?即,闭包指向自身,而实例指向函数。都不能解除分配。
最佳答案
“如果函数本质上是闭包的话。”这不是真的函数(和方法)与闭包不一样。函数的所有自由变量均未绑定。闭包已绑定了一些或所有自由变量(在其上封闭,这是“闭包”名称的来源)。
“自由变量”是在函数范围之外定义的任何变量(包括其形式参数)。顶层函数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
是绑定的。它不是免费的。调用c()
时无法通过它。self
在这里并不特殊。这只是另一个变量。闭包中的[weak self]
也不是特别的。您也可以编写[weak x]
。 [...]
语法只是捕获列表。关于ios - Swift,为什么类方法不需要闭包列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50243148/