保留类方法块的循环

时间:2016-06-24 16:20:20

标签: ios objective-c block retain weak

据我所知,当我们使用块时,我们必须使用代码创建运行方法的对象的__weak实例,然后使用__strong实例来保持弱点:

__weak __typeof(self) weakSelf = self;
[self setHandler:^{
     __strong __typeof(weakSelf) strongSelf = weakSelf;
     [strongSelf doSomething];
}];

直到这里很明显,如果我们从区块内部调用自我,它将被自己保留并且从未被释放。但我的问题是当块在类方法(而不是实例方法)中时如何处理相同的情况,例如在UIView动画中:

[UIView animateWithDuration:...
                      delay:...
                    options:...
                 animations:^{
                 // [self someMethod] or weak/strong reference to self [strongSelf someMethod]?
                         }
                 completion:^(BOOL finished) {
                 // [self someMethod] or weak/strong reference to self [strongSelf someMethod]?
                         }];

在这些情况下,我看过几个使用弱/强引用自我的例子,但由于完成不是从任何实例调用的,它应该保留自己,我错过了什么?谢谢!

1 个答案:

答案 0 :(得分:4)

当你的对象(self)对块有强引用并且块有一个引用回到你的对象时,你需要使用weakSelf。

对于UIView类方法,您不拥有 - 引用此块,以便您可以在其中使用self而不创建保留周期。该块将执行,然后将被释放。