在许多关于如何使用块和GCD的指南中,总是提到一个提示:不要在块中保留self。
细节是在定义一个块时,如果你引用self或者我自己的ivar,那么block会保留self。因此,解决方法是使用__block
修饰符来获取weakSelf
或weakIvar
。
但不这样做有什么害处?如果块保留自我,它应该在块完成时释放自我(我是否正确?)。因此,最终自我的参考计数是平衡的。我知道如果自我保留了块并且块保留了自身,那么它将是一个保留周期。块和self都将被解除分配。但是如果使用GCD,自我不保留块,为什么不让块保留自己?
答案 0 :(得分:8)
保留自我没有害处,除非阻挡住了。如果您正在使用GCD执行块然后将其删除,那么这很好。如果self有一个对它所存在的块的引用(即self.someBlock = ^{self.x = 2;}
),这只是一个问题,因为那时你有一个保留周期。
我个人喜欢在GCD中保留self(如果使用)的块,因为你无法真正控制块何时执行且无法取消,因此如果不保留self,则可以在取消分配后执行。