DPM*_*itu 4 xcode memory-leaks ios
我正在处理内存泄漏,调试器并没有太大帮助。我注意到我的几个视图控制器在被解雇后仍然在内存中。我的假设是有一个强有力的参考,我一直在寻找。
deinit记录消息的。这就是我第一次知道对象没有被释放的方式。weak var. Xcode 没有警告。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)
任何建议或意见,将不胜感激。
我已经想通了,你会的。原来这是一个关闭。
我正在实现新的 diffable 数据源,它需要一个用于提供单元格的闭包和一个用于提供标题的可选闭包。我没有在这些闭包中使用“弱自我”。
结论是调试器可能会产生误导:它显示我的 UICollectionViewLayout 作为对我的对象的唯一引用,即使该引用很弱。通过在 viewDidDisappear 中将此特定引用设置为 nil,我发现了真正的罪魁祸首,突然间调试器变得更有帮助了。