我在一个闭包里面有一个闭包,第二个闭包使用self,所以两个都应该有无主的自我,或者只是第二个闭包应该有它?
dispatch_async(backgroundQueue) { [unowned self] () -> Void in
dispatch_async(dispatch_get_main_queue(), { [unowned self] () -> Void in
self.doSomething()
})
}
答案 0 :(得分:6)
这是保留图没有 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可能会被解除分配并导致你的应用程序崩溃。
答案 1 :(得分:1)
两者都应该拥有无主的自我,或者只有第二个封闭应该拥有它?
以上都不是。如果您只是dispatch_async
,[unowned self]
是错误的。在两个地方删除它。 都不需要它。