Swift 斯威夫特,多少钱;“自我”;闭包是否捕获?
我对这种情况感到困惑:Swift 斯威夫特,多少钱;“自我”;闭包是否捕获?,swift,closures,Swift,Closures,我对这种情况感到困惑: 类将转义闭包Z传递给某个全局队列 在闭包Z中,我们调用类A中的funcs,以及仅从类A引用的类B 就在闭包Z从类B调用函数之前,类B被清除 在这一点上,B类对闭包Z意味着什么?在被抓获时它仍然是旧的B还是新的零?(假设B是代表) == 另一个后续问题是,如果闭包Z调用的类B的函数引用了类B中更多的东西,那么B的“自我”是如何被捕获的,它是强还是弱 我的困惑是因为在闭包Z中,我可以指定[weake self],但对于我想在类B中调用的函数,我不能这样做。和只从类A引用的类B
我的困惑是因为在闭包Z中,我可以指定[weake self],但对于我想在类B中调用的函数,我不能这样做。
和只从类A引用的类B。
这意味着两件事之一:
B
实例是一个强属性,至少在a
实例被释放之前不会被释放,a
实例在闭包结束之前不会被释放B
实例是一个弱属性,可能随时被释放(a
实例在这种情况下没有什么可说的)。但同时,这意味着B
实例必须是可选的,因此编译器将强制您正确处理它被解除分配的场景(当然,您可以强制解除它,但这是您的问题)A
中的意思是这样的:
var objB: B?
就在闭包Z从类B调用函数之前,类B被清除
嗯,只有一种方法可以清除B
:
objB = nil
现在,当您在闭包中调用B的方法时,您将得到一个“在展开可选值时意外发现nil”
这是因为在闭包中只捕获了self
,即A
。您根本没有捕获B
。B
的实例由A
的强引用保留。基本上,B
不会被闭包捕获
我的困惑是因为在闭包Z中,我可以指定[weake self],但对于我想在类B中调用的函数,我不能这样做
不过,您可以捕获B
。就这样,
[b = self.objB] in ...
您还可以使其变弱:
[weak b = self.objB] in ...
这样,您也可以在闭包中捕获B。
B
不能是弱对吗?如果它很弱,那么它已经被取消初始化了,因为它只是从A类中引用的。谢谢你的快速回复,这是非常有用的。关于最后一点,关于[weake b=self.objB]在。。。如果B已经是a中的弱变量,我需要这样做吗?或者,即使不是这样,闭包仍然应该通过[弱A]捕获B,因此B也因此是弱的?从技术上讲,B不被闭包捕获。闭包包含对a的引用,a包含对B的引用。如果在闭包中显式捕获B,则闭包同时包含对a和B的引用,a也包含对B的引用。看到区别了吗@嘟嘟