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可能会被释放并导致你的应用程序崩溃.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...