我在一个闭包内有一个闭包,第二个闭包使用 self,所以两者都应该有 unowned self 还是只有第二个闭包应该有它?
dispatch_async(backgroundQueue) { [unowned self] () -> Void in
dispatch_async(dispatch_get_main_queue(), { [unowned self] () -> Void in
self.doSomething()
})
}
最佳答案
这是没有 unowned
的保留图,它没有任何循环,因此您不需要 unowned
来破坏任何东西。a -> b
表示 a 保留 b
backgroundQueue -> outerBlock -> self
| ^
V |
mainQueue -> innerBlock -----
只有当
self
保留任何块时,才会形成循环。还要注意,即使
backgroundQueue
确实保留了 outerBlock
,block 会在执行后被释放,所以如果自己保留 backgroundQueue
,保留周期将不会持续。这是带有
unowned
(您的代码)的保留图a -x- b
表示使用 b 而不保留它(无主) backgroundQueue -> outerBlock -x- self
| |
V x
mainQueue -> innerBlock -----
你可以看到
self
没有被任何东西保留,这意味着当 innerBlock 被执行时,self 可能会被释放并导致你的应用程序崩溃。关于ios - 在 Swift 的闭包内使用 unowned,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28076681/