2011-08-29 2 views
3

문제점은 기본적으로 다음과 같습니다. EventDispatcher를 확장하는 클래스의 인스턴스가 있습니다.ActionScript의 약한 참조에 의해 이벤트 리스너가 추가 된 문제

myObject.addEventListener('eventName', someFunction, false, 0, false); 

하지만 뭔가 이벤트 리스너가 약한 참조를 추가 할 때 변경 :

myObject.addEventListener('eventName', someFunction, false, 0, true); 

이제 된 SomeFuncion도 라인이 있지만 호출되지 않습니다 나는이 같은 객체에 이벤트 리스너를 추가 할 때 모든 것이 순조롭게 진행 dispatchEvent ('eventName')를 포함하는 것은 이전과 마찬가지로 실행되고 있습니다 (myObject에 대한 외부 참조도 있음).

내가 개발중인 응용 프로그램은 매우 복잡하므로 불행히도 정확한 코드를 게시 할 수 없습니다.

답변

5

GC 작동 방법에 대해 오해하고 있습니다. 약한 참조를 사용하면 myObject가 핀 고정되지 않습니다. myObject 그 자체가 살아있는 한, 핸들러가 수집되도록 선언 된 범위를 막을 수 있습니다 (반드시 그렇지는 않음). 따라서 콜백 자체가 수집되어 실행되지 않을 수 있습니다. 이것은 당신의 설명에 따라 여기에있는 것 같습니다.

그래서 목표는 someFunction을 선언하는 범위가 수집되지 않도록하는 것입니다. 한 가지 방법은 실제로 하드 심판을 사용하는 것입니다 (내게 묻는다면 약한 심판은 나쁜 생각입니다). 다른 앱이있을 수도 있지만 앱이 어떻게 구성되어 있는지 알지 못해 많이 말할 수 없습니다.

메모를 편집하려면 편집하십시오.

GC와 같이 이벤트 처리는 일반적인 경우와 다르지 않습니다. 리스너를 추가하면 디스패처에 대한 참조가 전달됩니다 (참조는 리스너가 선언 된 범위입니다). 디스패치는이 참조를 저장하므로 필요할 때 콜백을 실행할 수 있습니다. 그것은이에서 정말 다른 아니다 : 이제

myObject.keepThisReference = someFunction; 

, myObejctsomeFunction에 대한 참조를 가지고있다. 따라서 myObject이 살아있는 한 someFunction을 약한 참조로 설정하지 않는 한 someFunction도 활성화됩니다.

그래서, 주어진 (객체가 다른 곳에서 참조하지만, 연결된 이벤트 리스너를 가지고되지 않음) 귀하의 코멘트에서이 시나리오를 질문에 대답 : 다른 참조가없는

myObject.addEventListener('someEvent',someFunction); 

myObject 경우와 범위를 벗어나면 입니다.

+0

네가 맞아. 이벤트 처리 루틴은 리스너가 아닌 객체에 대한 참조를 약하게 유지한다고 생각했습니다. 음, 이제 또 다른 질문이 있습니다. 어떤 오브젝트에 대한 참조가 없지만 이벤트 리스너가 첨부되어 있으면이 오브젝트를 수집합니까? –

+0

@Danylo Mysak. 예, 제 편집을 확인하십시오. –

+0

대단히 감사합니다! –

0

myObject에 대한 다른 링크가 없으면 현재 가지고있는 기능이 범위를 벗어날 때 수집됩니다. 약한 청취자가 아니도록 코드를 변경하거나 코드에 myObject에 대한 참조가 있는지 확인하십시오.

관련 문제