我很难理解关闭是如何创建的。
例如在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调用闭包之前被释放时,闭包对象仍然在堆中,因为gcd对它有很强的引用,但是我不明白当ViewController为nil时,gcd怎么会在闭包中调用闭包ViewController A?
我误会了吗?
最佳答案
闭包不在“ViewController A中”。您说“ViewController A ...对闭包附加强引用”,但是在显示的代码中没有强引用。调用dispatch_async
会将闭包移交给GCD,GCD将保留它并将其放置在队列中以供以后执行。
在执行时,对weakSelf
的引用指向ViewController A(因为ViewController A仍然存在),在这种情况下,我们现在可以设置其property
,或者它是nil
(因为ViewController A已经不存在) ,在这种情况下我们什么也不做,因为那是问号的意思。
关于ios - 快速关闭通过引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38966123/