我们是否需要在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];
}];
我们应该在这里使用弱自我吗?
答案 0 :(得分:39)
这不是保留周期。保留周期
self -> block -> self
在这种情况下,我们有
animation framework -> block
block -> self
其中第一个保留只是临时的 - 当动画结束时块被释放。即使发生了保留周期,它也只是暂时的,并且不会阻止对象的重新分配。
答案 1 :(得分:4)
当保留周期可用时,您需要使用__weak
。这种情况不,因为自动不会保留动画块。
使用__weak
的另一种情况是一个延长的操作,它将在完成后调用我们的块,并且在此操作期间可以释放self
。例如,某些网络请求将在完成块中调用视图控制器的接口更新。用户可以在请求期间退出我们的屏幕在这种情况下,不需要保留self
一个块,使用弱自我更好。但是使用动画块也是不这种情况。
答案 2 :(得分:2)
不,它不会创建保留周期,因为块(闭包)未附加到self
。
有关详细信息,请查看Apple的Automatic Reference Counting。