繁体   English   中英

Swift,闭包捕获了多少“自我”?

[英]Swift, how much of “self” do closures capture?

我对这种情况感到困惑:

  1. A类将转义的闭包Z交给某个全局队列。

  2. 在闭包Z中,我们称A类为类,而B类仅从A类中引用。

  3. 在闭包Z从类B调用函数之前,类B被清除了。

  4. B级对此时的封闭Z意味着什么? 在捕获时还是旧的B还是新的Nil? (假设B是代表)

==

另一个跟进问题是,如果闭包Z调用的B类函数在B类中引用了更多东西,那么B的“自我”是如何被捕获的呢?

我感到困惑的原因是,在闭包Z中,我可以指定[弱自我],但是对于要在类B中调用的函数,我不能这样做。

and class B who is only referenced from class A.

这意味着两件事:

  1. B实例是一个很强的属性,至少在A实例被释放之前不会被释放,并且A实例直到闭包结束才被释放。

  2. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM