在块中保留自我的危害是什么?(Objective-C,GCD)

Jim*_*mmy 4 objective-c grand-central-dispatch objective-c-blocks

在许多关于如何使用块和GCD的指南中,总是提到一个提示:不要在块中保留self.

细节是在定义一个块时,如果你引用self或者我自己的ivar,那么block会保留self.因此,解决方法是使用__block修饰符来获取weakSelfweakIvar.

但是不这样做有什么害处呢?如果块保留自我,它应该在块完成时释放自我(我是否正确?).因此,最终自我的参考计数是平衡的.我知道如果自我保留了块并且块保留了自身,那么它将是一个保留周期.块和self都将被解除分配.但是如果使用GCD,自我不保留块,为什么不让块保留自己?

hyp*_*ypt 8

保留自我没有害处,除非阻挡留在身边.如果您正在使用GCD执行块然后将其删除,那么这很好.如果self有一个对它保持的块的引用(即self.someBlock = ^{self.x = 2;}),这只是一个问题,因为那时你有一个保留周期.

我个人喜欢在GCD中保留self(如果使用)的块,因为你无法真正控制块何时执行且无法取消,因此如果不保留self,则可以在取消分配后执行.