MVVMCross는 주로 약한 참조를 사용하여 이벤트 구독을위한 쓰레기 수집을 보장합니다. 다음은 작동 방식에 대한 자세한 설명입니다.
mvvmcross 메신저의 개요
MVMCross 메신저 플러그인은 구성 요소 간의 이벤트 집계를 용이하게하도록 설계되었습니다. 메시지를 게시하고 구독하여 구성 요소가 통신 할 수 있습니다. 메신저는 이벤트 구독에 대해 약한 참조를 사용하여 쓰레기 수집기가 더 이상 참조되지 않은 객체를 제거 할 수 있도록하여 메모리 누출을 방지합니다.
mvvmcross의 약한 참조
MVVMCross 메신저를 사용하여 메시지를 구독하면 약하거나 강한 참조를 사용하는지 여부를 지정할 수 있습니다. 기본적으로 MVVMCross는 구독에 약한 참조 (`mvxReference.weak`)를 사용합니다. 이는 메신저가 콜백 메소드에 대한 강력한 참조를 보유하지 않으므로 가비지 수집기가 구독 한 객체가 범위를 벗어나지 않으면 구독을 제거 할 수 있습니다.
구독 및 수신 취시
구독은 여러 가지 방법을 사용하여 관리 할 수 있습니다.
- 구독 : 메시지는 게시 스레드에서 직접 전달됩니다.
- SubscribeOnMainThread : 메시지는 기본 UI 스레드에 마샬링됩니다.
-subscribeonthreadpoolthread : 스레드 풀 처리를 위해 메시지가 대기됩니다.
각 구독 메소드는 'MVXSubscriptionToken'을 반환하며 메시지를 구독 해제하는 데 사용할 수 있습니다. 그러나 토큰이 저장되지 않으면 구독은 즉시 쓰레기를 수집 할 수 있습니다.
쓰레기 수집 메커니즘
MVVMCross의 쓰레기 수집 메커니즘은 'mvxsubscriptionToken'이 범위를 벗어날 때 수집되는 쓰레기에 의존합니다. 구독 토큰이 저장되지 않은 경우 쓰레기 수집을받을 수 있으므로 이벤트 핸들러의 수신을 초래할 수 있습니다. 이 접근법은 이벤트 구독으로 인해 객체가 불필요하게 메모리에 유지되지 않도록합니다.
구독 상태 관찰
MVVMCross는 또한`hassubscriptionsfor` 및`countsubscriptionsfor`와 같은 현재 구독 상태를 관찰하는 방법을 제공합니다. 또한 Messenger는 구독이 추가, 제거 또는 만료 될 때마다 'MvxSubscriberChangemessage'메시지를 게시하여 구성 요소가 현재 구독 상태에 따라 동작을 조정할 수 있도록합니다.
메모리 관리를위한 모범 사례
효과적인 쓰레기 수집을 보장하고 메모리 누출을 방지하기 위해 :
- 가능할 때마다 이벤트 구독에 대해 약한 참조를 사용하십시오.
- 구독 토큰 저장 구독을 명시 적으로 관리 해야하는 경우.
- 더 이상 필요하지 않은 경우, 특히 강한 참조를 사용하는 경우 이벤트를 구독 취소하십시오.
- 뷰 모델이나 뷰와 같이 쓰레기를 수집 해야하는 물체에 대한 강력한 언급을 피하십시오.
이러한 관행을 따르고 MVVMCross의 약한 구독 메커니즘을 활용함으로써 개발자는 이벤트 구독이 객체가 쓰레기를 수집하는 것을 방해하지 않도록하여 응용 프로그램에서 효율적인 메모리 관리를 유지할 수 있습니다.
인용 :[1] https://www.mvvmcross.com/documentation/plugins/messenger
[2] https://stackoverflow.com/questions/39315395/mvvmcross-best-way-to-raise-in-viewmodel
[3] https://stackoverflow.com/questions/12494804/helping-the-gc-in-ono-droid-using-mvvmcross
[4] https://gregshackles.com/weak-subscription-gotcha-in-mvvmcross/
[5] https://github.com/mvvmcross/mvvmcross/issues/2145
[6] https://livebook.manning.com/book/xamarin-in-action/b-using-mvvm-light-instead-of-mvvmcross/v-15/
[7] https://stackoverflow.com/questions/30798429/mvvmcross-android-viewmodel-never-garbage-collected
[8] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-and-setup
[9] https://www.spicelogic.com/blog/net-event-henler-mory-leak-16