2

据我所知,当我们使用块时,我们必须创建一个__weak使用代码运行该方法的对象实例,然后创建__strong一个以保持弱者存活:

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

直到这里很清楚,如果我们从块内部调用 self ,它将自行保留并且永远不会释放。但我的问题是当块在类方法(而不是实例方法)中时如何处理相同的情况,例如在 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,我错过了什么吗?谢谢!

4

1 回答 1

4

当您的对象(self)对块具有强引用并且块具有对您对象的引用时,您需要使用weakSelf。

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

于 2016-06-24T16:37:33.117 回答