swift 闭包通过引用传递?

swift closure pass by reference?

我无法理解闭包是如何创建的。

例如 ViewController A:

dispatch_async(dispatch_get_main_queue()) [weak weakSelf = self] {              
  weakSelf?.property = "something"
}

我猜这段代码是如何工作的

1) ViewController A 只需创建一个闭包(假设闭包存储在堆地址 :0 中)并附加对闭包的强引用

2) 主队列中的对象还有另一个对闭包的强引用,因为内存指针正在被 ViewController A

中的函数传递

3) 当 ViewController A 在 gcd 调用闭包之前 dealloc 时,闭包对象仍然在堆中,因为 gcd 对它有强引用,但我不明白当 ViewController 为 nil,gcd 将如何调用 ViewController A 中的闭包?

我是不是误会了什么?

闭包不是 "in" ViewController A. 你说 "ViewController A ... attach a strong reference to the closure" 但你显示的代码中没有强引用。调用 dispatch_async 将闭包交给 GCD,GCD 保留它并将其放入队列以供稍后执行。

在执行时,或者对weakSelf的引用指向ViewControllerA(因为ViewControllerA仍然存在),在这种情况下我们现在可以设置它是 property,或者是 nil(因为 ViewController A 已经不存在了),在这种情况下我们什么都不做,因为这就是问号的意思。