在闭包内使用 unowned for Swift
Use of unowned inside the closure of the closure for Swift
我在一个闭包中有一个闭包,第二个闭包使用 self,所以两者都应该有 unowned self 还是只有第二个闭包应该有它?
dispatch_async(backgroundQueue) { [unowned self] () -> Void in
dispatch_async(dispatch_get_main_queue(), { [unowned self] () -> Void in
self.doSomething()
})
}
both should have unowned self or just the second closure should have it?
None 以上。如果你只是做 dispatch_async
,那么 [unowned self]
就是一个错误。把这两个地方都删掉。 都不需要。
这是保留图没有unowned
,它没有任何循环,所以你不需要unowned
来破坏任何东西。
a -> b
表示a保留b
backgroundQueue -> outerBlock -> self
| ^
V |
mainQueue -> innerBlock -----
只有当self
保留任何块时,才形成一个循环。
另请注意,即使backgroundQueue
确实保留outerBlock
,该块将在执行后释放,因此如果自我保留backgroundQueue
,则保留循环将不会持续。
这是保留图 with unowned
(您的代码)
a -x- b
表示 a use b without retain it (unowned)
backgroundQueue -> outerBlock -x- self
| |
V x
mainQueue -> innerBlock -----
你可以看到self
没有被任何东西保留,这意味着当执行innerBlock时,self可能会被释放并导致你的应用程序崩溃。
我在一个闭包中有一个闭包,第二个闭包使用 self,所以两者都应该有 unowned self 还是只有第二个闭包应该有它?
dispatch_async(backgroundQueue) { [unowned self] () -> Void in
dispatch_async(dispatch_get_main_queue(), { [unowned self] () -> Void in
self.doSomething()
})
}
both should have unowned self or just the second closure should have it?
None 以上。如果你只是做 dispatch_async
,那么 [unowned self]
就是一个错误。把这两个地方都删掉。 都不需要。
这是保留图没有unowned
,它没有任何循环,所以你不需要unowned
来破坏任何东西。
a -> b
表示a保留b
backgroundQueue -> outerBlock -> self
| ^
V |
mainQueue -> innerBlock -----
只有当self
保留任何块时,才形成一个循环。
另请注意,即使backgroundQueue
确实保留outerBlock
,该块将在执行后释放,因此如果自我保留backgroundQueue
,则保留循环将不会持续。
这是保留图 with unowned
(您的代码)
a -x- b
表示 a use b without retain it (unowned)
backgroundQueue -> outerBlock -x- self
| |
V x
mainQueue -> innerBlock -----
你可以看到self
没有被任何东西保留,这意味着当执行innerBlock时,self可能会被释放并导致你的应用程序崩溃。