我对这种情况感到困惑:
A类将逃逸的封闭Z交给某个全局队列。
在闭包Z中,我们在A类中调用func,在B类中调用仅从A类调用的函数。
就在关闭Z调用B类函数之前,B类被清理掉了。
此时B类对闭合Z意味着什么?在捕获时还是新的n仍然是旧的B? (假设B是代表)
==
另一个后续问题是,如果封闭Z调用的B级函数在B类中引用了更多的东西,那么B的“自我”是如何被捕获的,是强还是弱?
我的困惑之所以来,因为在关闭Z时,我可以指定[弱自我],但我不能为我想要在B类中调用的函数执行此操作。
答案 0 :(得分:0)
and class B who is only referenced from class A.
这意味着两件事:
B
实例是一个强大的属性,至少在A
实例被释放之前不会被释放,A
实例将不会被释放,直到结束闭合。
B
实例是一个弱属性,可能随时被释放(A
实例在这种情况下无话可说)。但同时它意味着B
实例必须是可选的,因此编译器会强制你正确处理它被解除分配的场景(当然你可以强行打开它,但那就是你的问题)。
答案 1 :(得分:0)
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.