MVVMCross (또는 .NET 프레임 워크)의 약한 이벤트 패턴과 고전적인 이벤트는 다른 목적을 제공하며 주로 메모리 누출 및 객체 수명을 관리하는 것을 목표로하는 뚜렷한 구현을 가지고 있습니다.
클래식 이벤트
.NET의 고전적인 이벤트는 강력한 참조를 기반으로합니다. 객체가 다른 객체의 이벤트에 가입하면 이벤트 소스에서 가입자로 강력한 참조가 생성됩니다. 이는 이벤트 소스가 가입자에 대한 참조를 보유하는 한 가입자가 더 이상 응용 프로그램의 다른 곳에서 필요하거나 참조되지 않더라도 가비지를 수집 할 수 없음을 의미합니다. 가입자가 더 이상 필요하지 않은 이벤트에서 명시 적으로 구독되지 않은 경우 메모리 누출로 이어질 수 있습니다.
MVVMCross에서는 클래식 이벤트가 뷰 모델과 뷰 사이의 통신에 사용될 수 있지만 메모리 누출을 피하기 위해 신중한 관리가 필요합니다. 예를 들어, ViewModel이 이벤트를 노출시키고 View가 구독하는 경우 ViewModel은보기에 대한 강력한 참조를 보유하여 구독이 명시 적으로 제거 될 때까지 쓰레기를 수집하지 못하게합니다.
약한 이벤트 패턴
약한 이벤트 패턴은 강한 참조 대신 약한 참조를 사용하여 메모리 누출을 방지하도록 설계되었습니다. 가입자가 약한 이벤트 패턴을 사용하여 이벤트를 구독하면 이벤트 소스는 가입자에 대한 약한 참조를 보유합니다. 이를 통해 가입자는 이벤트에서 명시 적으로 구독되지 않은 경우에도 응용 프로그램의 다른 곳에서 더 이상 참조되지 않으면 가입자를 수집 할 수 있습니다.
MVVMCross에서는 약한 이벤트를 사용하면 뷰 모델이보기에 대한 강력한 참조를 보유하지 않도록하여 깨끗한 아키텍처를 유지하는 데 도움이 될 수 있습니다. 이것은 메모리 관리가 중요한 모바일 애플리케이션에서 특히 중요합니다. MVVMCross는 약한 이벤트의 사용을 용이하게하기 위해`약점 구독 '과 같은 확장을 제공하여 개발자가 메모리 누출로 이어질 수있는 강력한 참조를 만들지 않고 이벤트를 구독 할 수 있도록합니다.
구현 및 혜택
약한 이벤트 구현에는 일반적으로 '약점'객체를 사용하여 구독을 관리하기위한 사용자 정의 메커니즘을 작성하는 것이 포함됩니다. 이 접근 방식은 가입자가 더 이상 필요하지 않은 경우 쓰레기를 수집 할 수 있도록하여 메모리 누출 위험이 줄어 듭니다. 그러나 이벤트 처리기를 호출하기 전에 가입자가 여전히 살아 있는지 확인해야하기 때문에 추가 복잡성과 약간의 성능 오버 헤드도 소개합니다.
단점 및 고려 사항
약한 이벤트 패턴은 메모리 누출을 방지하는 데 유리하지만 몇 가지 단점이 있습니다. 고전적인 이벤트보다 구현하는 것이 더 복잡 할 수 있으며, 더 이상 사용하지 않지만 아직 쓰레기가 수집되지 않은 "Zombie"가입자 객체의 위험이 있습니다. 이벤트가 제기되고 좀비 가입자의 핸들러가 실행되면 예상치 못한 동작이나 오류로 이어질 수 있습니다.
요약하면, MVVMCross의 약한 이벤트 패턴은 약한 참조를 사용하여 메모리 누출을 방지하고 가입자를 더 쉽게 수집 할 수있게함으로써 고전적인 이벤트와 다릅니다. 메모리 관리 측면에서 상당한 이점을 제공하지만 잠재적 인 단점을 신중하게 구현하고 고려해야합니다.
인용 :[1] https://stackoverflow.com/a/19379912
[2] http://stackoverflow.com/questions/30848118/capturing-the-onexit-event-in-wpf-with-mvvmcross/31784453
[3] https://www.reactiveui.net/vs/mvvmcross
[4] https://mustafacanyucel.com/blog/blog-22.html
[5] https://ladimolnar.com/2015/09/14/the-weak-event-pattern-is-dangerous/
[6] https://www.mvvmcross.com/mvvmcross-6.0.0-release/
[7] https://yanxiaodi.gitbook.io/xamarin-mvvmcross handbook/using-mvvmcross-to-create-your-first-xamarin-app/navigation/respenting-the-events-from-different-controls-in-the-listview
[8] https://www.devleader.ca/2024/02/14/weak-in-in-c-how-to-avoid-nasty-mory-leaks
[9] https://learn.microsoft.com/en-us/dotnet/desktop/wpf/events/weak-event-patterns?view=netdesktop-9.0
[10] https://www.mvvmcross.com/documentation/fundamentals/navigation
[11] https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle
[12] https://stackoverflow.com/questions/13788787/when-to-use---------- 이벤트