首页 > 解决方案 > 自定义委托和数据源 NSObjects 最佳实践

问题描述

所以考虑这种情况,我有一个UIViewController包含一个简单的UICollectionView,但Delegate & DataSource协议NSObjectUIViewController.

它看起来像这样

class MainCollctionViewDelegate: NSObject, UICollectionViewDelegate
class MainCollectionViewDataSrouce: NSObject, UICollectionViewDataSource

UIViewController像这样在我的内部使用它们,

lazy var CVDelegate = MainCollctionViewDelegate()
lazy var CVDataSource = MainCollectionViewDataSrouce()
//MARK: - Life Cycle
override func viewDidLoad() {
    super.viewDidLoad()
    collectionView.registerCell(PlainCell.self) // register custom cell Nib into collection View.
    collectionView.delegate = CVDelegate //Set Deleagte
    collectionView.dataSource = CVDataSource // Set data Source
}

这种方法将来会导致任何内存泄漏吗?考虑到我将来会实现注入来填充数据源,CollectionView就像这样。

 MainCollectionViewDataSrouce(with: Foo) // Foo is some data to populate the collection with. 

有更好的做法吗?考虑到我正在尝试实现最少的代码编写(冗余)。

注意:这也适用于UITableViewDelegate&UITableViewDataSource

标签: iosswiftmemory-management

解决方案


这种方法将来会导致任何内存泄漏吗?

不是现在。
您的内存图将如下所示: 内存图

所以这里没有内存周期,也没有理由泄漏内存。

重要。如果您在 viewController 上添加来自 DataSource / Delegate 的引用,请确保它是弱引用,否则您将创建内存循环。

注意。您可以在 collectionView 上添加来自 DataSource / Delegate 的强引用,因为 collectionView 在 dataSource 和委托上具有弱引用。所以也没有循环

边注

最好在数据源中注册单元格,因为“只有”数据源知道将使用什么类型的单元格。


推荐阅读