闭包关闭超出范围的类类型实例;可以通过闭包实例以某种方式访问​​实例吗?

时间:2016-01-11 19:37:04

标签: swift closures

问题:对于() - 返回闭包的情况,是否有任何方法可以访问ARC仅允许 的变量关闭它的封闭引用?在下面的示例中:访问闭包中的bb

下面举例说明我的意思。

Language Reference - Expressions中,它显示为

  

捕获列表

     

默认情况下,闭包表达式从中捕获常量和变量   它的周围范围强烈引用这些值。您可以   使用捕获列表显式控制如何在a中捕获值   闭合。

     

...

考虑以下示例,使用两个类类型实例的弱捕获和强捕获

class MyClass {
    var myInt : Int = 0
    func printMyInt() {
        print(myInt)
    }
}

func getClosure(a: MyClass, _ b: MyClass) -> (() -> ()) {
    return { [weak aa = a, bb = b] in
        aa?.printMyInt() ?? print("Lost reference")
        bb.printMyInt()
    }
}

func foo() -> (() -> ()) {
    let a = MyClass()
    let b = MyClass()

    let closure = getClosure(a, b)
    closure() // 0, 0
    a.myInt = 1
    b.myInt = 2
    closure() // 1, 2

    return closure
}

如果调用了foo(),则在closure返回时,MyClass个实例ab超出范围。在闭包本身中,aa保留了对a的弱引用,因此a(内存)将被“销毁”#34}。通过ARC,aa将变为零。

但是,由于闭包在b处以强引用结束,因此ARC将保留b的内存,直到闭包本身超出范围。

let closure = foo()
closure() // Lost reference, 2 <-- OK, expected
/* 'b' (not the reference, but the object in memory) still lives, but
   cant be explicitly accessed? */

因此我的问题是:如何在闭包中访问bb

我尝试了什么

我使用Mirror尝试没有成功:

var bar = Mirror(reflecting: closure)
print(bar.children.count) // 0

另外,我知道我们可以&#34;访问&#34;上面示例中的bb通过向闭包添加返回类型(MyClass),但我想知道如果没有这样的解决方法我们是否可以访问它(因此() - 在上面的问题中返回特定的闭包。)

在发布此问题之前我已经查看了

我一直在寻找可能存在的线程来询问和回答这个问题,但是我找到的最接近的一个,

在这里真的不回答我的问题。 (或者也许这个问题的答案中的解决方法 ,上面我的问题的答案是&#34;你不能&#34; ?)

0 个答案:

没有答案