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