[英]Use of unowned inside the closure of the closure for Swift
我在一个闭包里面有一个闭包,第二个闭包使用self,所以两个都应该有无主的自我,或者只是第二个闭包应该有它?
dispatch_async(backgroundQueue) { [unowned self] () -> Void in
dispatch_async(dispatch_get_main_queue(), { [unowned self] () -> Void in
self.doSomething()
})
}
这是没有 unowned
的保留图,它没有任何周期,所以你不需要unowned
来破坏任何东西。
a -> b
表示保留b
backgroundQueue -> outerBlock -> self
| ^
V |
mainQueue -> innerBlock -----
仅当self
保留任何块时才形成循环。
另请注意,即使backgroundQueue
确实保留了outerBlock
,该块也会在执行后释放,因此如果自我保留backgroundQueue
,保留周期将不会保持。
这是在保持与图unowned
(代码)
a -x- b
表示使用b而不保留它(无主)
backgroundQueue -> outerBlock -x- self
| |
V x
mainQueue -> innerBlock -----
你可以看到self
没有被任何东西保留,这意味着当执行innerBlock时,self可能会被释放并导致你的应用程序崩溃。
两者都应该拥有无主的自我,或者只是第二封应该拥有它?
以上都不是。 如果您只是在执行dispatch_async
,那么[unowned self]
是一个错误。 在两个地方删除它。 都不需要它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.