在Swift关闭的闭包内使用无主

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)

Bry*_*hen 6

这是没有 的保留图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这意味着保留,自我可以被释放,并且会导致应用程序崩溃.