是的,XCode中的内存图工具可以帮助识别MVVMCross应用程序中的保留周期。这是它的工作原理以及如何应用于MVVMCross:
##理解保留周期
当两个或多个对象彼此之间具有强烈的参考,从而阻止它们与记忆划分时,请保留周期。这是iOS开发中的一个常见问题,尤其是在使用强烈捕获对象的代表或关闭时。
##使用内存图工具
1。运行该应用程序并拍摄快照:要使用内存图工具,请在Xcode中运行MVVMCross应用程序,然后通过其核心流进行导航。在不同点处进行内存快照,尤其是在远离应划分的视图或视图模型之后。
2。分析快照:在内存图调试器中,左面板显示了当前内存中的所有对象,以及它们的实例计数。寻找本应被交易但仍存在的对象。随着时间的推移,班级实例的数量增加可以表明保留周期。
3。识别保留周期:在左图中选择一个对象以查看其对象图。该图显示了将对象保存在内存中的引用。粗线表示强烈的参考,而浅灰色线表示未知参考(可能是弱或强)。如果您看到一个循环,其中对象互相参考,则可能是保留周期。
4.修复保留周期:一旦确定了保留周期,请查看您的代码以查找创建强引用的位置。通常,这涉及改变对弱参考的强烈参考,尤其是在代表或闭幕式中。
##适用于mvvmcross
在MVVMCross应用中,视图模型与视图的生命周期紧密耦合。如果无法正确管理,这有时会导致保留周期。例如,如果一个视图模型对视图有很强的参考,并且该视图还对视图模型(也许是通过绑定)具有强有力的引用,则可能会发生保留周期。
为了在MVVMCross中避免这种情况,请确保视图中的任何参考文献都是薄弱的。使用MVVMCROSS提供的生命周期方法(例如“消失”)清理视图时,请清理任何强烈的参考。此外,使用内存图工具验证视图模型在从导航堆栈中删除时正确处理的视图模型。
##识别MVVMCROSS中的保留周期的示例
假设您有一个绑定到`myview'的“ myviewModel”。如果``MyView''对“ myViewModel”有很强的引用,并且``myviewModel''也对``myview''(也许是通过代表或闭合)都有强有力的引用,那么即使在远离`Myview''中,您也会看到两个对象都保留在内存中。使用内存图工具,您将识别此周期,然后在必要时修改代码以使用弱参考。
通过遵循这些步骤并使用内存图工具,您可以有效地识别并解决MVVMCross应用程序中的保留周期,以确保您的应用程序的内存使用量保持有效且稳定。
引用:[1] https://doordash.engineering/2019/05/22/ios-memory-leaks-and-retain-cycle-detection-using-using-xcodes-memory-graph-debugger/
[2] https://careersatdoordash.com/blog/ios-memory-leaks-and-retain-cycle-detection-using-xcodes-memory-graph-debugger/
[3] https://www.tothenew.com/blog/memory-leak-with-memory-graph-debugger/
[4] https://paul-samuels.com/blog/2018/11/20/unit-testing-retain-cycles/
[5] https://www.mvvmcross.com/mvvmcross-5-release/
[6] https://stackoverflow.com/questions/54040726/mvvmcross-android-appears-to-be-bee-hold-op-hold-ob-viewmodels--viewmodels-and-never-never-never-disposing-w
[7] https://www.donnywals.com/ususe-xcodes-memorygraph-to-find-memory-leaks/
[8] https://www.mvvmcross.com/mvvmcross-6.0.0-release/
[9] https://stackoverflow.com/questions/41660486/knowwhow-where-where-ther-cycles-are-are-and-and-moving-them