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

时间:2015-04-21 11:20:53

标签: ios automatic-ref-counting objective-c-blocks retain-cycle

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

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

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

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

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

3 个答案:

答案 0 :(得分:39)

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

self -> block -> self

在这种情况下,我们有

animation framework -> block
block -> self

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

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