我们需要在 ARC 的 UIAnimationBlocks 中使用 __weak self 吗?

Do we need to use __weak self inside UIAnimationBlocks in ARC?

我们是否需要在 UIAnimation 块中使用 __weak self,如下所示?如果我们不指定 self 为 weak 是否会产生 retain cycle 问题?

[UIView animateWithDuration:animationDuration 
                      delay:0 
                    options:UIViewAnimationCurveEaseInOut 
                 animations:^{
        [self doSomething];
    } completion:^(BOOL finished) {
        if (finished) {
            [self doSomething];
        }
    }];

我也对以下场景感到困惑。对此有什么想法吗?请分享您的意见。

[self.navController dismissViewControllerAnimated:animated 
                                       completion:^{
                                                      [self doSomething];
                                                  }];

我们应该在这里使用 weak self 吗?

不,它不会创建保留循环,因为块(闭包)未附加到 self
有关详细信息,请查看 Apple 的 Automatic Reference Counting.

这不是一个保留循环。保留周期为

self -> block -> self

在这种情况下我们有

animation framework -> block
block -> self

其中第一个保留只是暂时的 - 块在动画结束时被释放。即使发生循环保留,也只是暂时的,不会阻止对象释放。

当保留循环可行时,您需要使用__weak不是那种情况,因为动画块不是由自己保留的。

另一种使用__weak的情况是一个长时间的动作,它会在完成后调用我们的块,并且self可以在这个动作期间被释放。例如,某些网络请求将在完成块中为我们的视图控制器调用接口更新。用户可以在请求期间退出我们的屏幕。在这种情况下不需要用块保留 self ,最好使用 weak self 。但是使用动画块不是这种情况。