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 已经不存在了),在这种情况下我们什么都不做,因为这就是问号的意思。
我无法理解闭包是如何创建的。
例如 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 已经不存在了),在这种情况下我们什么都不做,因为这就是问号的意思。