如何使用 collectionview 摆脱保留循环

How to get rid of retain cycle with collectionview

我在销毁 viewcontroller 时遇到了麻烦,因为我认为这是集合视图和 viewcontroller 之间的保留周期。我尝试使 collectionview 成为一个弱变量,但现在每当我尝试将 collectionview 添加到 viewcontroller 时,我都会得到 nil。如果有其他方法可以尝试,而不是让 collectionview 变弱,我也愿意。

weak var table = UICollectionView(frame: CGRect(x: 0, y: 0, width: 0, height: 0), collectionViewLayout: UICollectionViewFlowLayout())
weak var customFlowLayout = UICollectionViewFlowLayout() //default cell spacing is 10





table?.frame = CGRect(x: 0, y: 50, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
table?.isHidden = true
table?.backgroundColor = UIColor.white
table?.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "customCellIdentifier")
table?.dataSource = self
table?.delegate = self
//table.rowHeight = CGFloat(100)
customFlowLayout?.minimumLineSpacing = 5 //default is 10
table?.collectionViewLayout = customFlowLayout!
self.view.addSubview(table!)  //this is the line that breaks every time

我在您提供的代码中没有看到任何循环保留。除非有一个块被传递到某处,否则很难有一个由标准 UICollectionView 直接引起的保留周期。如果有的话,很可能你持有 UICollectionView 的视图控制器永远不会被释放。

UICollectionView 的视图控制器上的 属性 可能很弱,但您需要将局部变量声明为强引用(没有 weak),如下所示:

class ViewController : UIViewController {
    weak var collectionView: UICollectionView?

    // Maybe in viewDidLoad()    
    let cv = UICollectionView(...)
    ...
    self.view.addSubview(cv)
    self.collectionView = cv

你的本地声明应该是一个强引用,否则它将被分配并立即释放,因为没有任何东西持有它。一旦 cv 被添加为子视图,那么它将具有来自 view 的强引用。您的 class 的 属性 称为 collectionView 现在可以是一个弱引用,一旦视图被释放,collectionView 就会被释放。