据我所知,当我们使用 block 时,我们必须创建一个使用代码运行该方法的对象的 __weak
实例,然后创建一个 __strong
实例来保留弱者还活着:
__weak __typeof(self) weakSelf = self;
[self setHandler:^{
__strong __typeof(weakSelf) strongSelf = weakSelf;
[strongSelf doSomething];
}];
到目前为止,很清楚,如果我们从 block 内部调用 self ,它将被自身保留并且永远不会被释放。但我的问题是,当 block 位于类方法(而不是实例方法)中时,如何处理相同的情况,例如在 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]?
}];
在这些情况下,我见过几个使用对 self 的弱/强引用的示例,但由于没有从任何实例调用完成,所以它应该保留 self,我是否遗漏了一些东西?谢谢!
最佳答案
当您的对象(自身)对 block 有强引用并且 block 对您的对象具有引用时,您需要使用weakSelf。
对于您不拥有的 UIView 类方法 - 引用此 block ,以便您可以在其中使用 self 而无需创建保留周期。该 block 将被执行,然后被释放。
关于ios - 类方法 block 上的保留循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38017936/