据我所知,当我们使用块时,我们必须使用代码创建运行方法的对象的__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]?
}];
在这些情况下,我看过几个使用弱/强引用自我的例子,但由于完成不是从任何实例调用的,它应该保留自己,我错过了什么?谢谢!
答案 0 :(得分:4)
当你的对象(self)对块有强引用并且块有一个引用回到你的对象时,你需要使用weakSelf。
对于UIView类方法,您不拥有 - 引用此块,以便您可以在其中使用self而不创建保留周期。该块将执行,然后将被释放。