当有延迟并在集合视图中执行批量更新时,自我是否应该在 UIView.animate 中变弱?

Should self be weak in UIView.animate when there is a delay and in collection view perform batch updates?

总的来说,我知道我们不需要在使用 UIView.animate() 时让自己变弱,因为这个块没有被牢固地保持,但是在下面的位中是否有使用 weak 的论点代码由于延迟?为什么有人会说可能有?

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

在下面的例子中为什么要用weak self/not 需要用weak self...?

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

背景:

Blocks/Closures 只不过是堆内存中的引用计数对象。当您创建一个块并持有对 block/closure 的强引用时,您声明块的引用计数增加 1。

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

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

这就是死锁 :) 您的 self 持有对块对象的强引用,而块对象 intern 持有对 self 的强引用。现在双方将等待对方释放并最终永远不会释放对方。

回答你的问题:

正如您所指出的,如果您没有强烈持有 UIView.animate 块的引用,则没有令人信服的理由让您通过 weak self,collectionView 批量更新也是如此。

你的情况

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

我相信集合是 collectionView,如果它是一个 IBOutlet,您一定已经观察到它被声明为弱对象。所以你的代码一定看起来更像

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

希望对您有所帮助