1

약한 참조가 작동하는 방식을 이해하지만 actionscript 이벤트 리스너에서 사용하는 것과 관련하여 다소 혼란 스럽습니다. 아래의 예를 고려해 단지 푸에 약한 참조가 있기 때문에, 지금 여기액션 스크립트 리스너의 약한 참조에 대한 설명

public class Rectangle extends MovieClip { 
    public function Rectangle() { 
    var screen:Shape=new Shape(); 
    screen.addEventListener(MouseEvent.MOUSE_OUT, new Foo().listen, false, 0, true); 
    addChild(screen); 
    } 
} 

public class Foo extends MovieClip { 
    public function listen(e:MouseEvent):void { 
    trace("tracing");   
    }   
} 

를 이벤트 리스너가 푸 가비지 수집되지 않을 경우 언제 가비지 컬렉터가 실행되고 예상대로 작동 코드 정지?

약한 이벤트 수신기 시나리오는 아래의 동일한 클래스에있는 이벤트 수신기 메서드에만 규정되어 있습니까?

public class Rectangle extends MovieClip { 
    public function Rectangle() { 
    var screen:Shape=new Shape(); 
    screen..addEventListener(MouseEvent.MOUSE_OUT, listen, false, 0, true); 
    addChild(screen); 
    } 

    public function listen(e:MouseEvent):void { 
    trace("tracing");   
    } 
} 

약한 이벤트 리스너가 어떻게 도움이됩니까?

Rectangle 객체에 다른 참조가없는 경우 가비지 수집의 후보가되지만 객체 내에 이벤트 리스너가 있으므로 다른 참조가 없더라도 이벤트 디스패처는 객체에 대한 참조를 보유합니다. (이벤트 리스너가 보유하고있는 것 이외의) 객체에 전달합니다. 따라서 쓰레기 수거가 금지됩니다. 이것이 약한 이벤트 리스너가 처방되는 이유입니까? 플래시 플레이어가 너무 순진하여 이벤트 리스너가 동일한 객체 내에 정의되어 있는지 알 수 없습니까?

답변

3

플래시의 가비지 수집에 대한 기본 규칙은 타임 라인에서 객체가 (직접 또는 간접적으로) 참조되는 경우 가비지 수집 될 수 없다는 것입니다. 즉, 클래스의 인스턴스가 루트 표시 목록의 어디에서나 참조되는 경우 (또는 루트에서 차례대로 참조되는 객체 등) 참조가 있는지 여부에 관계없이 클래스의 인스턴스가 수집됩니다. 그 자체.

이렇게하면 서로를 참조하지만 루트 표시 목록에서 어떤 식 으로든 참조되지 않는 두 개체는 가비지 수집 대상이됩니다.

이벤트 리스너의 약한 참조 옵션은 주로 이벤트 수신기를 수동으로 제거 할 필요가 없도록하기위한 것입니다. 저는 개인적으로 그것을 사용하지 않는 경향이 있습니다. 왜냐하면 객체가 가비지 콜렉션으로 표시 될 때를 완전히 제어하기를 좋아하기 때문입니다.

첫 번째 예에서 Foo 인스턴스는 모든 경우 가비지 수집 대상입니다. 두 번째 단계에서 Rectangle 인스턴스가 가비지 수집 될 수 있는지 여부는 표시 목록에서 참조되는지 여부에 따라 다릅니다. 이와 관련하여 useWeakReference 플래그는 아무런 차이가 없습니다. 문서 here에서

: 가비지 컬렉션에 쓰는없이 클래스 레벨 멤버 함수의 useWeakReference를 true로 설정할 수 있도록

클래스 레벨 멤버 함수는 가비지 컬렉션의 대상이되지 않습니다. 중첩 된 내부 함수 인 리스너에 대해 useWeakReference를 true로 설정하면이 함수는 가비지 수집되어 더 이상 지속되지 않습니다. 내부 함수 (다른 변수에 저장)에 대한 참조를 작성하면 가비지 수집되지 않고 영구적으로 유지됩니다.

+0

답변 해 주셔서 감사합니다. 그러나 위에서 말했듯이 위의 시나리오에서 Foo가 가비지 수집을 할 수 있다면 코드의 논리에 어긋나지 않습니다. 마찬가지로, 많은 블로그는 모든 이벤트 리스너를 약하게 표시하는 것이 좋지만, 위와 같은 경우 클릭 이벤트가 항상 발생하는 것으로 예상되므로 오류가 발생하지는 않습니다. –

+1

글쎄, 어떤 블로그가 무슨 말을하든 관계없이 약한 참조는 그렇게하는 것이 타당한 경우에만 사용해야합니다. 객체를 메모리에 유지해야하는 경우에는 사용하지 마십시오. 그러나, 나는 당신의 예제가 약간 이상하다고 생각한다. 왜냐하면 당신은 아마도 처음부터 그런 익명의 객체를 생성하지 않아야하기 때문이다. 가비지 수집 예제를 위해 괜찮 았지만 실제 프로젝트 코드로 다시 고려해야합니다. – richardolsson