关于ios:我们需要在ARC的UIAnimationBlocks中使用__weak self吗?

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

我们是否需要在UIAnimation块中使用__weak self,如下所示? 如果我们不指定自我弱,它是否会产生保留周期问题?

1
2
3
4
5
6
7
8
9
10
[UIView animateWithDuration:animationDuration
                      delay:0
                    options:UIViewAnimationCurveEaseInOut
                 animations:^{
        [self doSomething];
    } completion:^(BOOL finished) {
        if (finished) {
            [self doSomething];
        }
    }];

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

1
2
3
4
[self.navController dismissViewControllerAnimated:animated
                                       completion:^{
                                                      [self doSomething];
                                                  }];

我们应该在这里使用弱者吗?


这不是保留周期。保留周期将是

1
self -> block -> self

在这种情况下,我们有

1
2
animation framework -> block
block -> self

第一个保留只是临时的 - 当动画结束时块被释放。即使发生保留周期,它也只是暂时的,并且不会阻止对象的重新分配。


当保留周期可用时,您需要使用__weak。这不是那种情况,因为自动不保留动画块。

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


不,它不会创建保留周期,因为块(闭包)未附加到self
有关更多信息,请查看Apple的自动参考计数。