我的视图控制器被保留了(我认为),但我找不到强有力的参考

DPM*_*itu 4 xcode memory-leaks ios

我正在处理内存泄漏,调试器并没有太大帮助。我注意到我的几个视图控制器在被解雇后仍然在内存中。我的假设是有一个强有力的参考,我一直在寻找。

  • 对于我的每个类,我喜欢包含一个deinit记录消息的。这就是我第一次知道对象没有被释放的方式。
  • 当我检查内存图时,我发现被解散但仍在内存中的视图控制器。没有什么看起来像一个保留循环。所有的参考都是weak var. Xcode 没有警告。
  • 当我通过泄漏运行 memgraph 时,它报告了 0 leaks for 0 total leaked bytes.

当我在处理泄漏时,我注意到一个名为traceTree. 我用不应该存在的对象的地址运行它。它报告了以下内容......

2 <CaptureViewController 0x7fee7a008800> [1536]
  2 <WaterfallCollectionViewLayout 0x7fee47c0b450> [368]   +264: delegate 0x7fee47c0b558
    2 <UICollectionView 0x7fee7a060e00> [3072]  +1744: __strong _layout 0x7fee7a0614d0
      1 0x7fee47c10590 [112]    +24:  0x7fee47c105a8 --> offset 2
      + 1 0x7fee7b028000 [16896] +10600:  0x7fee7b02a968
      +   1 Region libobjc.A.dylib __DATA __bss: 'objc::AssociationsManager::_mapStorage' 0x7fff89c160c8
      1 0x7fee67d02c30 [304]   +112:  0x7fee67d02ca0
        1 0x7fee67d02100 [304]     +8:  0x7fee67d02108
          1 0x7fee7900be00 [8704]  +2432:  0x7fee7900c780
            1 Region dyld __DATA __common: '_main_thread' + 800 0x1155e1060
Run Code Online (Sandbox Code Playgroud)

问题:我真的不知道我在看什么。这是在告诉我有来自WaterfallCollectionViewLayoutto的强引用CaptureViewController吗?

CaptureViewController是一个UICollectionViewController并且WaterfallCollectionViewLayout是一个自定义UICollectionViewLayout。布局类使用集合视图控制器作为布局的委托。看起来像这样...

2 <CaptureViewController 0x7fee7a008800> [1536]
  2 <WaterfallCollectionViewLayout 0x7fee47c0b450> [368]   +264: delegate 0x7fee47c0b558
    2 <UICollectionView 0x7fee7a060e00> [3072]  +1744: __strong _layout 0x7fee7a0614d0
      1 0x7fee47c10590 [112]    +24:  0x7fee47c105a8 --> offset 2
      + 1 0x7fee7b028000 [16896] +10600:  0x7fee7b02a968
      +   1 Region libobjc.A.dylib __DATA __bss: 'objc::AssociationsManager::_mapStorage' 0x7fff89c160c8
      1 0x7fee67d02c30 [304]   +112:  0x7fee67d02ca0
        1 0x7fee67d02100 [304]     +8:  0x7fee67d02108
          1 0x7fee7900be00 [8704]  +2432:  0x7fee7900c780
            1 Region dyld __DATA __common: '_main_thread' + 800 0x1155e1060
Run Code Online (Sandbox Code Playgroud)

任何建议或意见,将不胜感激。

DPM*_*itu 7

我已经想通了,你会的。原来这一个关闭。

我正在实现新的 diffable 数据源,它需要一个用于提供单元格的闭包和一个用于提供标题的可选闭包。我没有在这些闭包中使用“弱自我”。

结论是调试器可能会产生误导:它显示我的 UICollectionViewLayout 作为对我的对象的唯一引用,即使该引用很弱。通过在 viewDidDisappear 中将此特定引用设置为 nil,我发现了真正的罪魁祸首,突然间调试器变得更有帮助了。

集合视图 Diffable 数据源

UI 数据源的进步 - WWDC 2019 - 220