본문 바로가기

ActionScript/AS3.0

모든 마우스 리스너 삭제

출처 Inmingun Blog | 인민군
원문 http://blog.naver.com/jhb0b/60032922261

모든 마우스 리스너 삭제


이번에는 Mouse객체에서 잃어버린(이미 삭제되거나) 리스너 객체를 찾아

그 등록된 리스너를 삭제하는 것을 연구 해 보았다.

뭐 거창하게 연구라고 할것은 없지만...ㅋㅋ


근데 버그성 같은 문제점이 발견되었는데...

Mouse객체에는 _listeners라는 객체가 private으로 잡혀 있어 컴파일 에러를 발생하게 된다.

Key객체에는 _listeners가 public으로 잡혀있어 문제 없이 접근이 가능하지만

Stage와 Mouse에서는 접근시 에러를 발생한다. (AS 2.0에만 해당됨)

물론 참조형 위임을 통한 접근이 가능해서 문제점은 해결이 되지만

이 부분은 Macromedia 플래시 개발팀이 간과한 부분이 아닐까 한다.

Mouse와 같이 등록된 리스너를 가지고 이벤트를 발생하는 플레이어 타입 전역객체

는 리스너를 등록하면 삭제(removeListener)를 하지 않는 한 등록하는 대로 계속 쌓이게 된다.

이렇게 계속해서 쌓이는 경우는 이벤트 리스너 오브젝트가 하위 무비클립에 존재하여

이 무비클립이 언로드되었을때 함께 삭제되어 버린다.

이렇게 삭제되어 버린 리스너 오브젝트는 식별자로써의 역할을 하게 되는데...

이미 삭제가 되어 removeListener를 하지 못하게 된다.

이럴때 식별자(정확히 말해서는 등록된 이벤트 리스너 오브젝트)를 잃어버린 모든

Mouse리스너를 삭제한다.

물론 이러한 경우가 발생하기 전에 모든 플랫폼 모듈을 잘 구성해야 하는 것

또한 중요하다는 사실을 알게 되었다.

이렇게 별것 아닌것 같은 문제점이 하나하나 쌓이다 보면 한번 실행되도록 명령을 준

핸들러가 2번 3번씩 실행되기 때문에 잘못된 연산이나 점유율과 리소스가 올라가는 현상도

생기게 될수 있다.


물론 3.0에서도 계속해서 리스너가 쌓이는 방식인데 이 또한 구성을 잘해야 될것이다.


function mouseListenersAllClear():Void {
    var Mouse_:Object = Mouse;
    var tempLen:Number = Mouse_._listeners.length;
    trace("● 마우스에 리스닝된 객체 수 :: "+tempLen);
    for(var i:Number=0;i<tempLen;i++) {  
        Mouse_.removeListener(Mouse_._listeners[i]);  
        delete Mouse_._listeners[i];  
    }
    trace("● 남아있는 마우스 리스너 수 :: "+Mouse_._listeners.length);
}
for(var i:Number=0;i<10;i++) {
    Mouse.addListener({onMouseWheel : function() {trace("onMouseUp");}});
}
var Mouse_:Object = Mouse;
var tempLen:Number = Mouse_._listeners.length;
trace("● : 등록된 리스너 수 :: "+tempLen);
this.onMouseUp = function() {
    mouseListenersAllClear();
};