背景 :
块/闭包只不过是堆内存中的引用计数对象。当你创建一个块并持有对块/闭包的强引用时,你声明了块的引用计数增加 1。
显然,这意味着即使在从内存中执行完块之后,该块也不会被释放,直到所有强烈持有对该块的引用的类都释放它们的强持有。
现在请记住,如果您将强大的 self 传递给块,因为在块内使用的变量会一直保持活动状态,直到块完成其执行(上下文捕获,这是函数和块之间的主要区别)self 将不会被释放,直到块本身被释放。
现在这是一个死锁 :) 你的 self 持有对块对象的强引用,而块对象实习生持有对 self 的强引用。现在双方都将等待对方释放,最终永远不会释放对方。
回答你的问题:
正如您所指出的,如果您没有强烈持有 UIView.animate 块的引用,则没有令人信服的理由让您传递弱自我,collectionView 批量更新也是如此。
在你的情况下
collectionView.performBatchUpdates({
self.collection.reloadData()
...
})
我相信collection是collectionView,如果它是一个IBOutlet,你一定已经观察到它被声明为弱对象。所以你的代码一定看起来更像
collectionView.performBatchUpdates({
self.collection?.reloadData()
...
})
希望能帮助到你