我在一个闭包里面有一个闭包,第二个闭包使用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可能会被释放并导致你的应用程序崩溃.