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

ara*_*_86 21 ios objective-c-blocks automatic-ref-counting retain-cycle

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

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

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

[self.navController dismissViewControllerAnimated:animated 
                                       completion:^{
                                                      [self doSomething];
                                                  }];
Run Code Online (Sandbox Code Playgroud)

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

Sul*_*han 49

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

self -> block -> self
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们有

animation framework -> block
block -> self
Run Code Online (Sandbox Code Playgroud)

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

  • @Boon 如果视图不在层次结构中,则实际上不执行动画并立即调用回调。 (2认同)

Vla*_*lad 6

您需要在可以__weak保留循环时使用。这是不是这种情况下,因为动画块不是由自我保持。

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