斯威夫特,封闭捕获了多少“自我”?

时间:2017-09-05 05:48:06

标签: swift closures

我对这种情况感到困惑:

  1. A类将逃逸的封闭Z交给某个全局队列。

  2. 在闭包Z中,我们在A类中调用func,在B类中调用仅从A类调用的函数。

  3. 就在关闭Z调用B类函数之前,B类被清理掉了。

  4. 此时B类对闭合Z意味着什么?在捕获时还是新的n仍然是旧的B? (假设B是代表)

  5. ==

    另一个后续问题是,如果封闭Z调用的B级函数在B类中引用了更多的东西,那么B的“自我”是如何被捕获的,是强还是弱?

    我的困惑之所以来,因为在关闭Z时,我可以指定[弱自我],但我不能为我想要在B类中调用的函数执行此操作。

2 个答案:

答案 0 :(得分:0)

and class B who is only referenced from class A.

这意味着两件事:

  1. B实例是一个强大的属性,至少在A实例被释放之前不会被释放,A实例将不会被释放,直到结束闭合。

  2. B实例是一个弱属性,可能随时被释放(A实例在这种情况下无话可说)。但同时它意味着B实例必须是可选的,因此编译器会强制你正确处理它被解除分配的场景(当然你可以强行打开它,但那就是你的问题)。

答案 1 :(得分:0)

  

B类,仅从A类引用。

我认为你在A中的意思是这样的:

var objB: B?
  

在关闭Z之前调用B类中的函数,B类被清除掉。

嗯,只有一种方法可以清除B

objB = nil

现在,当您在闭包中调用B的方法时,您将在解开可选值时获得“意外发现的nil”。

这是因为您只在关闭中捕获了selfA。您根本没有捕获B。来自B的强引用保留A的实例。基本上,闭包不会捕获B

  

我的困惑之所以来,因为在关闭Z时,我可以指定[弱自我],但我不能为我想要在B类中调用的函数执行此操作。

嗯,你可以捕获B。就像这样:

[b = self.objB] in ...

你也可以使它变弱:

[weak b = self.objB] in ...

这样你也可以在闭包中捕获B.