如果有延迟并且在集合视图中执行批量更新,UIView.animate中的自身应该是弱吗?

时间:2017-06-13 10:40:14

标签: ios swift weak

一般来说,我意识到在使用UIView.animate()时我们不需要自我弱化,因为块不是强有力的,但是有一个参数在下面的位中使用弱代码由于延迟?为什么会有人说可能有?

EmpID

在下面的例子中,为什么我们需要使用弱自我/不需要使用弱自我......?

UIView.animate(withDuration: 0.1, animations: {
  self.performAction()
}

1 个答案:

答案 0 :(得分:5)

背景:

块/闭包只不过是堆内存中的引用计数对象。创建块并保持对块/闭包的强引用时,您声明块的引用计数增加1.

显然这意味着即使在从内存执行块之后也不会释放块,直到强烈持有对块的引用的所有类都释放它们的强大保持。

现在记住这一点,如果你传递一个强大的self来阻止,因为块中使用的变量保持活动直到块完成它的执行(上下文捕获,这是函数和块之间的主要区别)self不会释放直到块本身被释放。

现在这就是一个死锁:)你的自己拥有对块对象的强引用,而块对象实习生拥有对自我的强引用。现在两个人都会等待对方释放并最终永远不会互相释放。

回答您的问题:

正如您所指出的,如果您没有强烈持有UIView.animate块的引用,那么您没有令人信服的理由让您传递弱自我,因此collectionView批量更新就是这样。

在你的情况下

collectionView.performBatchUpdates({
    self.collection.reloadData()
    ...
})

我相信collection是collectionView,如果它是一个IBOutlet,你必须观察到它被声明为弱对象。所以你的代码看起来更像是

collectionView.performBatchUpdates({
    self.collection?.reloadData()
    ...
})

希望有所帮助