我们需要在 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 。但是使用动画块不是这种情况。
我们是否需要在 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 。但是使用动画块不是这种情况。