ios - 自定义委托(delegate)和数据源 NSObject 最佳实践

标签 ios swift memory-management

考虑这种情况,我有一个 UIViewController,它包含一个简单的 UICollectionView,但是 Delegate & DataSource 协议(protocol)是分开的 来自 UIViewController 的 NSObject

看起来像这样

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
}

这种方法将来会导致任何内存泄漏吗?考虑到我将实现注入(inject)以填充 CollectionView 的数据源,以便将来成为这样的东西。

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

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

Note: this also applies for UITableViewDelegate & UITableViewDataSource

最佳答案

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

现在不行。
您的内存图将如下所示: memory graph

所以这里没有内存循环,也没有内存泄漏的理由。

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

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

旁注

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

关于ios - 自定义委托(delegate)和数据源 NSObject 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55324689/

相关文章:

ios - 高效处理多次/频繁调用 UIView needsDisplayInRect

ios - 如何在ios objective c中设置时间间隔api调用并在成功后重新加载 TableView

ios - UIPickerView Swift 上奇怪的自定义背景颜色

swift - 无法调用非函数类型的值 'AVAudioSession.RecordPermission'

linux - 当 RAM 已满并且新进程想要在嵌入式设备上运行时会发生什么?

ios - 如何在 Swift 中实现 "share button"

ios - Meteor run ios - 根本不工作

ios - Swift 2.1 - 制作宽度相对于文本长度的动态按钮

java - 获取在 Android 中使用应用程序的总 RAM 大小

c++ - 纹理像素操作中更新方法的内存管理