一般来说,我意识到在使用UIView.animate()时我们不需要自我弱化,因为块不是强有力的,但是有一个参数在下面的位中使用弱代码由于延迟?为什么会有人说可能有?
EmpID
在下面的例子中,为什么我们需要使用弱自我/不需要使用弱自我......?
UIView.animate(withDuration: 0.1, animations: {
self.performAction()
}
答案 0 :(得分:5)
背景:
块/闭包只不过是堆内存中的引用计数对象。创建块并保持对块/闭包的强引用时,您声明块的引用计数增加1.
显然这意味着即使在从内存执行块之后也不会释放块,直到强烈持有对块的引用的所有类都释放它们的强大保持。
现在记住这一点,如果你传递一个强大的self来阻止,因为块中使用的变量保持活动直到块完成它的执行(上下文捕获,这是函数和块之间的主要区别)self不会释放直到块本身被释放。
现在这就是一个死锁:)你的自己拥有对块对象的强引用,而块对象实习生拥有对自我的强引用。现在两个人都会等待对方释放并最终永远不会互相释放。
回答您的问题:
正如您所指出的,如果您没有强烈持有UIView.animate块的引用,那么您没有令人信服的理由让您传递弱自我,因此collectionView批量更新就是这样。
在你的情况下
collectionView.performBatchUpdates({
self.collection.reloadData()
...
})
我相信collection是collectionView,如果它是一个IBOutlet,你必须观察到它被声明为弱对象。所以你的代码看起来更像是
collectionView.performBatchUpdates({
self.collection?.reloadData()
...
})
希望有所帮助