MVVMCross는 다른 프레임 워크와 마찬가지로 이벤트 구독으로 인한 메모리 누출로 문제가됩니다. 이러한 누출은 객체가 이벤트에 가입하고 구독 취소에 실패 할 때 발생하여 더 이상 필요하지 않은 후에도 객체가 메모리에 남아 있습니다. MVMCross가 이러한 시나리오를 처리하는 방법은 다음과 같습니다.
이벤트 핸들러 누출 이해
이벤트 핸들러 유출은 이벤트 중심 프로그래밍에서 일반적입니다. 짧은 객체가 오래 지속 된 객체에서 이벤트를 구독하면 장거리 객체는 단기간에 대한 참조를 보유하여 쓰레기가 수집되는 것을 방지합니다. 이것은 MVVMCross와 같은 프레임 워크에서 중요한 문제로, 뷰와 뷰 모델이 이벤트를 통해 광범위하게 상호 작용합니다.
mvvmcross 접근
MVVMCross는 이벤트 구독을 관리하고 메모리 누출을 완화하는 메커니즘을 제공합니다.
1. 약한 참고 문헌 : MVVMCross는 약한 참조를 사용하여 구독 관리를 돕습니다. 약한 참조를 통해 쓰레기 수집기는 참조 된 경우에도 객체를 수집 할 수 있지만,이 접근법은 활성 뷰 모델에 대한 구독이 손실 될 수 있습니다. 따라서 응용 프로그램의 요구에 따라 약하고 강한 참조를 사용하는 것 사이의 균형을 유지하는 것이 중요합니다 [11].
2. 메신저 패턴 : MVVMCross는 메신저 패턴을 사용하여 뷰 모델이 서로 강한 참조를 유지하지 않고 통신 할 수 있습니다. 이 패턴은 약한 참조를 사용하여 메모리 누출을 방지 할 수 있지만 구독을 잃지 않도록 신중한 관리가 필요합니다 [11].
3. 수명주기 관리 : MVVMCross는 묘비 상태를위한 수명주기 방법을 제공합니다. 예를 들어 묘비 상태를 저장하기위한 'SavestateTobundle`'과 같은 모델과 같은 모델을 제공합니다. 개발자는 이러한 수명주기 이벤트 중에 수동으로 구독을 관리하여 누출을 방지해야합니다.
4. 매뉴얼 수신 실시되지 않은 수신 : MVVMCross에서 개발자는보기가 비활성화되거나 파괴 될 때 이벤트를 수동으로 구독하지 말 것을 권장합니다. 이것은 짧은 객체가 오래 지속 된 물체에 의해 참조되지 않도록하여 메모리 누출을 방지합니다 [11].
모범 사례
MVVMCross의 메모리 누출을 효과적으로 처리하려면 :
- 약한 구독 사용 : 가능하면 약한 구독을 사용하여 불필요하게 메모리에서 물체를 유지하는 것을 방지합니다 [10].
- 수동 관리 : View and View 모델 라이프 사이클 중에 구독이 올바르게 관리되는지 확인하십시오. 보기가 비활성화되거나 파괴 될 때의 이벤트를 구독 취소 [11].
- 메모리 사용 모니터링 : 프로파일 링 도구를 사용하여 개발 초기에 메모리 누출을 식별합니다.
이러한 전략 및 모범 사례를 따르면 개발자는 MVVMCross 응용 프로그램에서 이벤트 구독을 효과적으로 관리하고 메모리 누출을 완화 할 수 있습니다.
인용 :[1] https://community.devexpress.com/blogs/mobile/archive/2024/11/05/net-maui-momory-profiling-indifil-and-fix-mory-leaks.aspx
[2] https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle
[3] https://devblogs.microsoft.com/visualstudio/unlocking-the-secrets-of-managed-memory-into-into-event-leak-insights/
[4] https://www.spicelogic.com/blog/net-event-henler-mory-leak-16
[5] https://www.reddit.com/r/dotnetmaui/comments/1c1qlou/maui_memory_leaks/
[6] https://www.markheath.net/post/understanding-and-avoiding-mory-leaks
[7] https://learn.microsoft.com/en-us/shows/xamarinshow/xamarin-community-toomkit-weakeventmanager-to-stop-memory-leaks
[8] https://github.com/mvvmcross/mvvmcross/issues/409
[9] https://stackoverflow.com/questions/14771064/garbage-collecting-issue-with-custom-viewbinding-in-mono-touch-and-mvvmcross?rq=1
[10] https://stackoverflow.com/questions/39315395/mvvmcross-best-way-to-raise-in-viewmodel
[11] https://stackoverflow.com/questions/27008035/mvvmcross-memory-heak-because-od-disposed-viewmodels
[12] https://github.com/dotnet/maui/discussions/21918