Dan*_*ico 4 memory-management ios swift
我在一个闭包里面有一个闭包,第二个闭包使用self,所以两个都应该有无主的自我,或者只是第二个闭包应该有它?
dispatch_async(backgroundQueue) { [unowned self] () -> Void in
dispatch_async(dispatch_get_main_queue(), { [unowned self] () -> Void in
self.doSomething()
})
}
Run Code Online (Sandbox Code Playgroud)
这是没有 的保留图unowned,它没有任何循环,所以你不需要unowned破坏任何东西.
a -> b 意味着保留b
backgroundQueue -> outerBlock -> self
| ^
V |
mainQueue -> innerBlock -----
Run Code Online (Sandbox Code Playgroud)
仅在self保留任何块时才形成循环.
另请注意,即使backgroundQueue保留outerBlock,块也会在执行后释放,因此如果自行保留backgroundQueue,保留周期将不会保持.
这是带有 unowned(您的代码)的保留图
a -x- b 表示使用b而不保留它(无主)
backgroundQueue -> outerBlock -x- self
| |
V x
mainQueue -> innerBlock -----
Run Code Online (Sandbox Code Playgroud)
你可以看到self在不被任何东西,当执行innerBlock这意味着保留,自我可以被释放,并且会导致应用程序崩溃.