as3에서 메모리릭의 가장 큰 주범은 뭐니뭐니 해도 이벤트 리스너입니다. 약한 참조가 실제로 동작하지 않기 때문에 일단 addEventListener를 했다손 치면 Dispatcher도 Listener도 전혀 GC가 안됩니다.
매번 꼼꼼하게 removeEventListener를 해주는게 정답입니다만 그게 어디 그렇게 쉽나요. 1회성 이벤트의 경우 사용 후 즉시 해제하는 경우가 많습니다. 또 그렇지 않더라도 조건을 걸어서 얼마든지 자신이 호출되는 시점에 제거하는 건 가능하겠죠. 지금 소개시켜드리는 간단한 코드는 리스너가 스스로를 해지할 수 있게 도와줍니다.
1 |
function listener( $e:Event ): void { |
2 |
3 |
$e.target.removeEventListener( $e.type, arguments.callee, !$e.bubbles ); |
4 |
5 |
} |
뭐 설명을 드릴게 딱히 없습니다. 이벤트 객체에는 이미 dispatcher가 누구인지, 어떤 event인지 버블단계인지 캡쳐단계인지에 대한 충분한 정보가 포함되어있고, 마지막 걸림돌은 함수 자신을 가리키는 포인터인데 this는 함수 입장에서 클로저를 가리키는데 반해 arguments.callee는 함수 자신을 가리키므로 removeEventListener를 하기 위한 모든 재료가 갖춰집니다.
즉시 해지를 하던 if문 등이 관여해서 조건을 충족할 때 해지되게 하던, 그건 그때그때 생각해볼 문제고 중요한 포인트는 리스너 스스로가 자신을 해지하는 능력을 갖게 만들어 개발자가 신경쓰지 않아도 메모리릭을 방지한다는 점이겠죠.
게다가 저 코드는 하나의 리스너를 여러개의 dispatcher에 등록해도 잘 작동하기 때문에 범용적인 코드로서 충분한 매력이 있습니다.
원문 링크 : http://www.diebuster.com/?p=1092
원문 사이트 : http://www.diebster.com
'코드 > ActionScript & MXML' 카테고리의 다른 글
스케일폼 4.0에서 AS3.0 지원 (0) | 2011.04.02 |
---|---|
NetStream 클래스에서 NetStatusEvent, onMetaData (0) | 2011.02.16 |
렌더링 문답. (0) | 2010.10.31 |
FITC 2010 gskinner Quick Flash 플래시 컨텐츠 최적화 (0) | 2010.10.02 |
ColorTransform - AS 3.0 (0) | 2009.06.12 |