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传递给某个全局队列

  • 在闭包Z中,我们调用类A中的funcs,以及仅从类A引用的类B

  • 就在闭包Z从类B调用函数之前,类B被清除

  • 在这一点上,B类对闭包Z意味着什么?在被抓获时它仍然是旧的B还是新的零?(假设B是代表)

  • ==

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


    我的困惑是因为在闭包Z中,我可以指定[weake self],但对于我想在类B中调用的函数,我不能这样做。

    和只从类A引用的类B。

    这意味着两件事之一:

  • B
    实例是一个强属性,至少在
    a
    实例被释放之前不会被释放,
    a
    实例在闭包结束之前不会被释放

  • B
    实例是一个弱属性,可能随时被释放(
    a
    实例在这种情况下没有什么可说的)。但同时,这意味着
    B
    实例必须是可选的,因此编译器将强制您正确处理它被解除分配的场景(当然,您可以强制解除它,但这是您的问题)

  • B类,仅从A类引用

    我想你在
    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的引用。看到区别了吗@嘟嘟