[英]Swift, how much of “self” do closures capture?
我对这种情况感到困惑:
A类将转义的闭包Z交给某个全局队列。
在闭包Z中,我们称A类为类,而B类仅从A类中引用。
在闭包Z从类B调用函数之前,类B被清除了。
B级对此时的封闭Z意味着什么? 在捕获时还是旧的B还是新的Nil? (假设B是代表)
==
另一个跟进问题是,如果闭包Z调用的B类函数在B类中引用了更多东西,那么B的“自我”是如何被捕获的呢?
我感到困惑的原因是,在闭包Z中,我可以指定[弱自我],但是对于要在类B中调用的函数,我不能这样做。
and class B who is only referenced from class A.
这意味着两件事:
B
实例是一个很强的属性,至少在A
实例被释放之前不会被释放,并且A
实例直到闭包结束才被释放。
B
实例是一个弱属性,可能随时被释放(在这种情况下, A
实例无话可说)。 但是同时,这意味着B
实例必须是可选的,因此编译器将迫使您正确处理被释放的情况(当然,您可以强制对其进行拆包,但这是您的问题)。
仅从A类引用的B类。
我认为您在A
意思是这样A
:
var objB: B?
在闭包Z从类B调用函数之前,类B被清除了。
好吧,只有一种方法可以清除B
:
objB = nil
现在,当您在闭包中调用B的方法时,您将得到“在展开一个可选值时意外发现nil”。
这是因为您仅在闭包中捕获了self
,即A
您根本没有捕获到B
B
的实例由A
的强引用保留。 基本上, B
没有被闭包捕获。
我感到困惑的原因是,在闭包Z中,我可以指定[弱自我],但是对于要在类B中调用的函数,我不能这样做。
好吧,虽然您可以捕获B
像这样:
[b = self.objB] in ...
您也可以使其变弱:
[weak b = self.objB] in ...
这样,您还可以捕获闭包中的B。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.