在MVVMCROSS中,就像在其他框架中一样,使用弱率和强烈报酬之间的选择对于管理内存和防止内存泄漏至关重要。这是对差异及其在MVVMCross背景下应用的详细说明:
###强参考
**强引用是大多数编程语言(包括C#)中参考的默认类型。当强烈引用对象时,垃圾收集器无法收集该对象,直到所有对物体的强烈引用被删除。这意味着,只要至少有一个有力的对象引用,它将保留在内存中。
在MVVMCross中,如果无法正确管理,则强有力的参考可能会导致内存泄漏。例如,如果A ViewModel对视图有很强的参考,并且该视图也对ViewModel有很强的引用,则会创建保留周期。这可以防止两个物体即使不再需要垃圾也被收集。
###弱参考
**另一方面,如果不存在强引用,则弱参考允许垃圾收集器收集引用的对象。这在您想要允许对象垃圾(如果不再需要的情况下收集垃圾)的情况下特别有用,但是如果碰巧可用,仍然希望访问它。
在MVVMCross中,鼓励使用弱参考,以避免在视图和视图之间保留周期。例如,您可以使用弱参考或消息系统在它们之间进行通信,而不是让ViewModel强烈引用视图。这样可以确保在不再需要时可以收集垃圾的视图,即使ViewModel仍然存在。
MVVMCross中的实例
考虑一个方案,即当加载某些数据时,ViewModel需要通知视图。一种常见的方法是在视图订阅的ViewModel中使用事件。但是,如果该视图强烈订阅了此事件,它将创建从ViewModel回到视图的强有力的引用,这可以防止视图被收集到垃圾。
为了避免这种情况,MVVMCross提供了诸如``fearsubscribe''之类的方法,该方法允许视图订阅ViewModel的事件。这样,ViewModel不会对视图有很强的参考,从而防止内存泄漏。
###在MVVMCross中使用弱参考的指南
- 使用弱参考来查看:当ViewModel需要与视图相互作用时,使用弱参考或消息系统来避免保留周期。
- 避免对视图的强烈参考:确保ViewModels不再对视图进行强有力的参考,以便在不再需要时收集垃圾。
- 使用消息传递系统:考虑使用MVVMCROSS的“ IMVXMESSENGER”之类的消息传递系统在不创建强引用的情况下在视图模型和视图之间进行通信。
通过遵循这些准则,您可以有效地管理MVVMCross应用程序中的内存,并防止常见问题(例如内存泄漏)。
引用:[1] https://stackoverflow.com/a/19379912
[2] https://forums.swift.org/t/unowned-references-have-more-overhead-than-than-than-strong-references/72765
[3] https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/weak-references
[4] https://www.reddit.com/r/swift/comments/8ifwy9/ios_mvvm_breaking_retainer_cycle_between/
[5] https://stackoverflow.com/questions/40966271/weak-reference-and-and-strong-reference
[6] https://langdev.stackexchange.com/questions/1351/appleaches-for-implementing-weak-reference
[7] https://putridparrot.com/blog/weakreferences-innet/
[8] http://java-latte.blogspot.com/2014/07/difference-between----rongreference-weakreference-weakreference-softreference-phantomreference-phantomreference-in-java.html