5

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

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

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

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

1 回答 1

6

背景 :

块/闭包只不过是堆内存中的引用计数对象。当你创建一个块并持有对块/闭包的强引用时,你声明了块的引用计数增加 1。

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

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

现在这是一个死锁 :) 你的 self 持有对块对象的强引用,而块对象实习生持有对 self 的强引用。现在双方都将等待对方释放,最终永远不会释放对方。

回答你的问题:

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

在你的情况下

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

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

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

希望能帮助到你

于 2017-06-13T11:16:54.047 回答