HOME | EXPERIENCE | GUESTBOOK | ADMIN | ABOUT
AS코딩에서 가장많이 사용되는 addEventListener
그런데 사실 본인은 이 메소드를 사용하는데 코딩상의 불편함을 항상 토로하기도 한다.
물론 지금은 습관처럼 죽~ 코딩을 하니 상관은 없지만
과거에는 왜 마지막 인자인 useWeakReference를 디폴트 값으로 false로 나둬서..끝까지 파라미터 값을 지정해야하는지
투덜되기도 했다.

addEventListener(type:Stringlistener:FunctionuseCapture:Boolean = falsepriority:int = 0, useWeakReference:Boolean = false):void


이게 메소드 기본 파라미터 셋팅이다.
무난하게 사용하기위해서
addEventListener(myTypemyListener); 이렇게 해도 되지만
보통 클래스단에서 작업을 많이할때나 본인같은경우 항상 약한참조를 true로 셋팅해야 왠지 기분이 후련해서.
addEventListener(myTypemyListener,false,0,true);
로 끝까지 지정을 해버린다.

useCapture 옵션은 false인데 이것은 말그대로 버블링 단계를 적용하지 않는다는 얘기이다.
이건 다음에 시간날때 설명을...

암튼..useWeakReference 때문에 항상 저렇게 코딩을 길게 늘어써야 했는데.. 왜 마지막 옵션을 false로 셋팅해놔서..
궁시렁궁시렁...

그런데 오늘 문득 그 원인을 알게되었다.
예전에 AS3.0을 맨처음 접했을때 나는 모든 리스너 등록을 로컬함수로 처리했다.
이건 AS2.0에 익숙해진 코딩탓도 있었지만 그땐 로컬변수가 가비지컬렉터에서 좀더 유연하다고 생각했기 때문이다.
물론 틀린말은 아니지만 addEventListener처럼 리스너로 등록되어 참조가 용인되는 녀석에겐 예외가 된다는것을
알지 못했다.
즉 메모리 누수와 같은 문제와 동일하게 이해할 수 있다.
JS에서 AJAX 처리에서 발생될수 있는 문제처럼
 F   ? 
1
2
3
var source = new ActiveXObject(“Ficitious.UrlFetcher”);
source.ondataready = new function() { source.ondataready = null; }
source.startRequest(url);

source.ondataready 가 발생되지 않으면 new function() { } 구문은 결국 가비지컬렉터에서 제외됨
이런맥락이라는 것을...

각설하고 이 이유를 알기위해 만약 다음처럼 코딩을 했다면
 F   ? 
1
2
3
myClip.addEventListener(MouseEvent.ROLL_OVER, function(e:MouseEvent):void {
trace(e);
},false,0,true);

이 코드에서 이벤트는 항상 유효할까?
이건 절대로 유효하지 않다.
바로 useWeekReference가 true 로 셋팅되었기 때문에 저때 등록된 표현식함수(로컬리스너)는 등록되자 마자 바로
삭제되어버린다.
약한참조이기 때문에 가비지가 제거를 해버린다는 얘기이다.
물론 저 코드를 등록하고 당장 테스트한다고 동작이 안되는건 아니다.
문제는 가비지컬렉터가 언제 동작할지 알수가 없기때문에 절대적으로 된다고 말하면 안되는것이다.

System.gc(); 같은 코드로 테스트무비에서 테스트하면 대부분 삭제되는것을 확인할수 있다.
(물론 이것도 가비지가 100%발동한다는건 아니지만)

하지만  저 코드를 등록하고 복잡한 구성요소나 많은 액션이 들어간 작업을 수행하면 어떨땐 동작하고 어떨땐 동작하지
않는 것을 알수 있다.
즉, 가비지가 발동될때 저 코드가 보인다면 저 코드는 바로 리스너는 등록되고 난 후에 삭제되어 버린다.

따라서 표현식으로 함수를 등록할때(메소드에서 로컬리스너로)는 필연적으로 useWeekReference = false로 셋팅해야한다.
즉 다음처럼
 F   ? 
1
2
3
myClip.addEventListener(MouseEvent.ROLL_OVER, function(e:MouseEvent):void {
trace(e);
});

그냥 리스너까지 파라미터를 완료하는것이다.
EDIT | DELETE
LINK • SUMMARY