바인딩과 메모리 릭

바인딩과 메모리 릭

작성일 2020.10.10댓글 2건
    게시물 수정 , 삭제는 로그인 필요

안녕하세요. wpf에 매모리 릭에 대해서 궁금한 점이 있어 질문 올립니다.

MVVM 패턴을 사용하고 있으며 ViewModel에서 ICommand형식의 프로퍼티를 생성하고

View의 Button의 Command에 바인딩 해주고 있습니다.

저는 상태를 저장한는 프로퍼티에는 당연히 get; set;과 PropertyChange();를 호출해주고 있습니다만

Button의 Command의 특성상 한번 바인딩하면 Command의 내용이 바뀔 여지가 없고

바뀌어서도 안된다고 생각해 아래와 같이 get; 만 생성해서 바인딩 해주고 있습니다.

public ICommand TestCommand => new RelayCommand(() =>
{
    // Do Something
});

여기서 궁금한점이 생겼습니다.


프로퍼티에 set을 생성하지 않으면 wpf 특성상 매모리 릭이 발생할 수 있어


모든 프로퍼티에 get과 set을 생성해줘야 한다는 리뷰를 받았습니다.


저는 이 부분에 대해서 더 공부해 보고 싶은 상황입니다.


메모리 릭이 발생하는 것에 대해서 설명 혹은 자료를 주실 수 있으신 분이 계시면 감사 드리겠습니다.


감사합니다.



profile_image 익명 작성일 -

그건 상관 없습니다.

WPF 에서 MVVM 패턴을 사용시 이벤트를 해제하지 않으면 메모리릭이 발생합니다.

Winform의 경우 자체적으로 모든 이벤트를 배열에 관리하고 창이 소멸할때 배열을 소거하는데

WPF/MVVM 의 경우 수작업으로 이벤트를 구독하다보니 해제를 안할경우 이벤트를 뿌려주는 객체가 소멸하지 못하여 메모리릭이 발생합니다.

WPF의 경우 WeakReference로 바인딩 되어 있어 코드쪽이 메모리 해제 되는데 상관이 없지만

사용자 코드에서 강력하게 이벤트를 물고 있으면 해제가 안되는겁니다.

ViewModel ===> XAML창 : 약한참조 // 창이 사라질수 있습니다.

ViewModel <== XAML창 : 강한참조 // 창을 Close 하더라도 ViewModel에서 이벤트를 구독하고 있어서 XAML이 사라지지 못합니다. 이부분이 WPF/MVVM 다룰때 문제입니다.

profile_image 익명 작성일 -

Set을 생성하지 않아서 메모리 릭이 발생하는게 아니라 해당 Get 프로퍼티 구현체를 보면

호출 할 때 마다 RelayCommand객체를 생성하고 매개인자로 익명 메서드를 던져주는 것을 볼 수 있는데

이렇게 하면 매번 RelayCommand 객체가 새로 생겨나고 해당 객체 및 해당 객체에서 참조하게 되는 모든 객체가 사용이 끊날 때 까지 메모리에서 정리되지 않고 유지 되므로 이로 인해 메모리 릭 포인트가 될 수 있다라고 봐야할 것 같습니다.

즉 매번 새로 생성할 필요가 우선 있는지 봐야겟죠

엄청 드문드문 호출한다해도 보통은 저런 형태의 get을 구현하는 일이 드물지만 만약 자주 호출하는 get 이라면 저렇게 객체를 생성하지 않아도 동일한 동작을 할 수 있을 만한 형태로 리팩토링이 필요해보입니다.

바인딩과 메모리 릭

... Command에 바인딩 해주고 있습니다. 저는 상태를 저장한는 프로퍼티에는 당연히... 인해 메모리 릭 포인트가 될 수 있다라고 봐야할 것 같습니다. 즉 매번 새로...

mfc에서 virtual키워드 관련

... 초기바인딩 후기바인딩이란 말이 있던데 그런 말과도 상관이 있는 내용인지... 포인터를 이용하는 방법은 반드시 메모리를 할당 받아야 한다는것이죠. 그럼...