MVVMCross에서 다른 프레임 워크에서와 같이 약점을 사용하는 것과 강력한 회의 사이의 선택은 메모리를 관리하고 메모리 누출을 방지하는 데 중요합니다. 다음은 MVVMCross의 맥락에서 차이점과 어떻게 적용되는지에 대한 자세한 설명입니다.
강한 참조
** 강력한 참조는 C#을 포함한 대부분의 프로그래밍 언어에서 기본 유형의 참조 유형입니다. 물체를 강력하게 참조하면 쓰레기 수집기가 물체에 대한 모든 강력한 참조가 제거 될 때까지 수집 할 수 없습니다. 이것은 객체에 대한 강한 참조가 하나 이상있는 한 메모리에 남아 있음을 의미합니다.
MVVMCross에서 강력한 참조는 제대로 관리하지 않으면 메모리 누출로 이어질 수 있습니다. 예를 들어, ViewModel이보기에 대한 강력한 참조를 보유하고 View가 ViewModel에 대한 강력한 참조를 보유하면 유지주기가 생성됩니다. 이것은 두 물체가 더 이상 필요하지 않은 경우에도 쓰레기를 수집하는 것을 방지합니다.
약한 참조
** 반면에 약한 참조는 강한 참조가 존재하지 않으면 쓰레기 수집기가 참조 된 객체를 수집하도록 허용합니다. 이는 더 이상 필요하지 않은 경우 객체를 수집 할 수있는 시나리오에서 특히 유용하지만 사용할 수있는 경우에도 여전히 액세스하려고합니다.
MVVMCross에서는 약한 참고 문헌을 사용하여 뷰 모델과 뷰 사이의주기를 유지하지 않도록 권장됩니다. 예를 들어, ViewModel이보기를 강력하게 참조하는 대신 약한 참조 또는 메시징 시스템을 사용하여 이들 사이에 통신 할 수 있습니다. 이렇게하면 뷰 모델이 여전히 존재하더라도 뷰가 더 이상 필요하지 않을 때는 쓰레기를 수집 할 수 있습니다.
mvvmcross의 실제 예
일부 데이터가로드 될 때 ViewModel이보기에 알리는 시나리오를 고려하십시오. 일반적인 접근법은보기가 구독하는 뷰 모델에서 이벤트를 사용하는 것입니다. 그러나 View 가이 이벤트에 강력하게 구독하면 ViewModel에서 View로 강력한 참조를 만들어 뷰가 수집되는 것을 방지 할 수 있습니다.
이를 피하기 위해 MVVMCross는`leadsubscribe '와 같은 방법을 제공하여 View가 ViewModel의 이벤트를 약하게 구독 할 수 있습니다. 이런 식으로, 뷰 모델은 뷰에 대한 강력한 참조를 가지고 있지 않아 메모리 누출을 방지합니다.
mvvmcross에서 약한 참조를 사용하기위한 지침
-보기에 약한 참조를 사용하십시오 : 뷰 모델이보기와 상호 작용 해야하는 경우, 약한 참조 또는 메시징 시스템을 사용하여주기를 유지하지 마십시오.
-보기에 대한 강력한 참조를 피하십시오 : 뷰 모델이 더 이상 필요하지 않을 때 뷰를 수집 할 수 있도록보기에 대한 강력한 참조를 보유하지 않도록하십시오.
- 메시징 시스템 사용 : MVVMCross의`IMVXMESSENGER '와 같은 메시징 시스템을 사용하여 강력한 참조를 만들지 않고도 뷰 모델과 뷰 사이를 통신합니다.
이 지침을 따르면 MVVMCross 응용 프로그램에서 메모리를 효과적으로 관리하고 메모리 누출과 같은 일반적인 문제를 방지 할 수 있습니다.
인용 :[1] https://stackoverflow.com/a/19379912
[2] https://forums.swift.org/t/unowned-references-more-overhead-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-strong-reference
[6] https://langdev.stackexchange.com/questions/1351/beptroaches-for-implementing-weak-references
[7] https://putridparrot.com/blog/weakreferences-in-net/
[8] http://java-latte.blogspot.com/2014/07/difference-between-strongreference-weakreference-softreference-phantomreference-in-java.html