본문 바로가기

ETC/ETC

Unity UnityAction과 Reference Count 궁금점

유니티의 UnitAction객체를 사용하는데 있어서 궁금증이 생겼다.


UnityAction은 우선 내부적으론 C#의 델리게이트형식으로 사용되고 있었으며


UnityAction 델리게이트에 추가한 객체가 null값을 대입해도 제대로 작동할지가 궁금하였다.


null값을 넣으면 해당 객체는 GC에서 수집해가서 수집된 이후에는


UnityAction이 엉뚱한 값을 가지고 있을거라 생각했었다.



    TestT testclass;

    UnityAction uAction;

    void Start () {

        testclass = new TestT();

        uAction += testclass.PrintA; // testclass 멤버변수 a값을 출력하는 함수

        uAction.Invoke(); 

        testclass = null; //여기서 GC가 testclass를 가져가서 아래줄이 작동이 제대로 되지 않을거 같았다.

        uAction.Invoke();

    }



우선 결과는 제대로 출력되었다.

이유를 생각해보니 여기서 실험한 testclass객체의 reference count에 원인이 있었다.

우선 new연산자를 통해 새로 할당을 했을때 reference count가 +1이 되었으며

uAction객체에 함수를 넣어줄때 uAction객체가 testclass객체를 참조하고 있으니

testclass객체의 reference count는 +1되어 총 2가 되었을것이다.

하지만 null값을 대입하므로 reference count는 -1이 되었지만 총 reference count는 2 - 1 = 1이므로

주소값을 가지고있는 testclass객체는 사라졌지만 실질적으로 아직 reference count가 1이므로

GC에서 수집해가지 않았다는걸 알수있었다.



결론 : 델리게이트에 객체의 함수를 Add할때도 reference count는 증가한다.

         해지할땐 Delegate에 등록된 event도 해제해주자

'ETC > ETC' 카테고리의 다른 글

OpenGL vs Metal  (0) 2019.04.23
Unity에서의 Variants란?  (0) 2019.02.27