Memory is not released during perform batch update

2019-08-20 09:22发布

问题:

I've been working on a project of using two UICollectionView's I have on that is the MainViewController with full screen cells that scroll horizontally and one that sits on that full screen cell and scrolls vertically. I have a functionality that adds as well as deletes cells. When a user taps and one of the pages of the MainViewController is deleted using the code below the memory that grew as cells were added is still being retained. Is there something Im doing wrong. All of my delegates are weak references and none of my cells have self referencing closures. Am I doing something wrong thank you for you help

Here is the full project

https://github.com/TheRedCamaro30/Leaky-Nested-UICollectionViews

Add or Remove Cell Delegate

func addCell(){
    self.mainCollectionView.performBatchUpdates({
        guard let last = arr.last else{
            return
        }
        arr.append(last + 1)
        let lastIndex = IndexPath(item: last, section: 0)
        self.mainCollectionView.insertItems(at: [lastIndex])
    }) { (completed) in
        print("Batch updates completed, performed successfully: \(completed)")
    }
    }

func removeCell() {
    self.mainCollectionView.performBatchUpdates({
    arr.popLast()
        self.mainCollectionView.deleteItems(at: [IndexPath(item: arr.count - 1, section: 0)])

    }) { (competed) in
        print("Perform batch updates completed")
    }
}

Full Sized Cell Cell Population

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: FullPageCell.reuseIdentifier, for: indexPath) as? FullPageCell else{
        assertionFailure("Fatal Error FullPageCell not dequed")
        return UICollectionViewCell()
    }
    cell.backgroundColor = UIColor.green
    cell.cellTappedDelegate = self

    return cell
}

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    if let cell = cell as? FullPageCell{
            cell.setUpCollectionView()
    }
}

SubCollectionView sitting on Full Page Cell Population

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: SmallCell.reuseIdentifier, for: indexPath) as? SmallCell else{
        assertionFailure("Fatal Error FullPageCell not dequed")
        return UICollectionViewCell()
    }
    cell.backgroundColor = UIColor.yellow
    cell.imageView.image = self.image
    return cell
}

SetUpCollectionView

 func setUpCollectionView(){
   let view = self.contentView

   let layout = UICollectionViewFlowLayout()
   layout.minimumLineSpacing = 1
   layout.minimumInteritemSpacing = 1
   layout.scrollDirection = .vertical
   layout.itemSize = CGSize(width: (view.bounds.width - 2)/3, height: (view.bounds.width - 2)/3)

   collectionView = UICollectionView(frame:view.bounds, collectionViewLayout: layout)


   collectionView.dataSource = self
   collectionView.delegate = self
   collectionView.register(SmallCell.self, forCellWithReuseIdentifier: SmallCell.reuseIdentifier)
   collectionView.backgroundColor = UIColor.white

   self.collectionView.isPagingEnabled = true

   view.addSubview(collectionView)

   collectionView.translatesAutoresizingMaskIntoConstraints = false
   collectionView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
   collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
   collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
   collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
 }

回答1:

To insert, delete, or move a single section or item, you must follow these steps:

  1. Update the data in your data source object.

  2. Call the appropriate method of the collection view to insert or delete the section or item.

Just replace removeCell method with below code.

func removeCell() {
    self.mainCollectionView.performBatchUpdates({
        arr.popLast()
        self.mainCollectionView.deleteItems(at: [IndexPath(item: arr.count - 1, section: 0)])
    }) { (competed) in
        print("Perform batch updates completed")
        //If it is not worked then reload collectionview
        //self.mainCollectionView.reloadData()
    }
}

Please refer below references.

Inserting, Deleting, and Moving Sections and Items

Collection View Programming Guide for iOS