약한 참조가 작동하는 방식을 이해하지만 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 객체에 다른 참조가없는 경우 가비지 수집의 후보가되지만 객체 내에 이벤트 리스너가 있으므로 다른 참조가 없더라도 이벤트 디스패처는 객체에 대한 참조를 보유합니다. (이벤트 리스너가 보유하고있는 것 이외의) 객체에 전달합니다. 따라서 쓰레기 수거가 금지됩니다. 이것이 약한 이벤트 리스너가 처방되는 이유입니까? 플래시 플레이어가 너무 순진하여 이벤트 리스너가 동일한 객체 내에 정의되어 있는지 알 수 없습니까?
답변 해 주셔서 감사합니다. 그러나 위에서 말했듯이 위의 시나리오에서 Foo가 가비지 수집을 할 수 있다면 코드의 논리에 어긋나지 않습니다. 마찬가지로, 많은 블로그는 모든 이벤트 리스너를 약하게 표시하는 것이 좋지만, 위와 같은 경우 클릭 이벤트가 항상 발생하는 것으로 예상되므로 오류가 발생하지는 않습니다. –
글쎄, 어떤 블로그가 무슨 말을하든 관계없이 약한 참조는 그렇게하는 것이 타당한 경우에만 사용해야합니다. 객체를 메모리에 유지해야하는 경우에는 사용하지 마십시오. 그러나, 나는 당신의 예제가 약간 이상하다고 생각한다. 왜냐하면 당신은 아마도 처음부터 그런 익명의 객체를 생성하지 않아야하기 때문이다. 가비지 수집 예제를 위해 괜찮 았지만 실제 프로젝트 코드로 다시 고려해야합니다. – richardolsson