微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我在一个闭包里面有一个闭包,第二个闭包使用self,所以两个都应该有无主的自我,或者只是第二个闭包应该有它?

dispatch_async(backgroundQueue) { [uNowned self] () -> Void in
    dispatch_async(dispatch_get_main_queue(),{ [uNowned self] () -> Void in
        self.doSomething()
    })
}

解决方法

这是没有无主的保留图,它没有任何周期,所以你不需要无主要来破坏任何东西.

a – > b表示保留b

backgroundQueue -> outerBlock -> self
                       |          ^
                       V          |
      mainQueue -> innerBlock -----

仅当自保留任何块时才形成循环.

另请注意,即使backgroundQueue确实保留了outerBlock,该块也会在执行后释放,因此如果自我保留backgroundQueue,保留周期将不会保持.

这是无主的保留图(您的代码)

a -x-b表示使用b而不保留它(无主)

backgroundQueue -> outerBlock -x- self
                           |          |
                           V          x
          mainQueue -> innerBlock -----

你可以看到self没有被任何东西保留,这意味着当执行innerBlock时,self可能会被释放并导致你的应用程序崩溃.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐