问题:对于()
- 返回闭包的情况,是否有任何方法可以访问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
个实例a
和b
超出范围。在闭包本身中,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; ?)