유니티의 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 |