문제

movieclips에 대한 데이터를 보유하는 사전이 있으며 MovieClips 사용을 중단하면 데이터를 수집하기를 원합니다. 약한 키 매개 변수를 사용하고 있으며 다른 데이터와 완벽하게 작동하지만 문제가 발생합니다.

이 코드는 훌륭합니다.

var mc = new MovieClip();
var dic = new Dictionary(true);
dic[mc] = 12;
mc = null;
System.gc();
System.gc();
for (var obj in dic)
   trace(obj);    //this doesn't execute

그러나 실제로 movieclip을 사용하면 작동이 멈 춥니 다.

var mc = new MovieClip();
var dic = new Dictionary(true);
dic[mc] = 12;
addChild(mc);
removeChild(mc);
mc = null;
System.gc();
System.gc();
for (var obj in dic)
   trace(obj);    //this prints [object Movieclip]

왜 이런 일이 발생합니까? 내가 잘못하고있는 일인가요? 해결 방법이 있습니까?

편집 :이 특정 예에서는 사용할 수 있음을 알고 있습니다. delete dic[mc], 물론 이것은 단순화 된 경우입니다. 일반적으로 사전에서 movieclip을 수동으로 제거하고 싶지는 않지만 응용 프로그램의 나머지 부분에서 더 이상 참조하지 않으면 자동이어야합니다.

edit2 : 나는 Aaron이 말한 것을 테스트하고 이상한 것들을 생각해 냈습니다.

var mc = new MovieClip();
var dic = new Dictionary(true);
dic[mc] = 12;
addChild(mc);
removeChild(mc);
mc = null;

for (var objeto in dic) {}    // <-- try commenting out this line

addEventListener('enterFrame', f);  // I print the contents every frame, to see if
                                    // it gets removed after awhile

function f(evento)
{
    System.gc();
    System.gc();

    for (var objeto in dic)
        trace(objeto);
}

이것은 표시된 선을 언급하지 않는 한, 아무것도 인쇄하지 않는 한, 모든 프레임의 [Object movieclip]를 계속 인쇄합니다.

도움이 되었습니까?

해결책

나는 문제가 타이밍 중 하나라고 생각합니다. remove child를 호출 할 때 "프레임"의 뒷부분까지 참조 수가 업데이트되지 않는다고 생각합니다. (어쨌든 이것이 일어나는 일이라고 생각합니다.)

아래 코드는 이것이 사실이라고 생각하는 이유를 보여줍니다. (저는 Flex를 사용하고 있지만 문제를 재현하는 것으로 보입니다.)

아래 코드 : 출력 :

[object MovieClip]
here

somefoo ()의 끝에서 Otherfoo에게 직접 전화하면 다음과 같이받습니다.

[object MovieClip]
here
[object MovieClip]

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" mouseDown="somefoo()">
<mx:Script>
    <![CDATA[
        import mx.core.UIComponent;
        private var dic:Dictionary = new Dictionary(true);
        private var ui:UIComponent = new UIComponent();
        private var mc:MovieClip = new MovieClip();

        private function somefoo():void {
            this.addChild(ui);

            dic[mc] = 12;
            ui.addChild(mc);
            ui.removeChild(mc);
            for (var obj:Object in dic)
               trace(obj);    //this prints [MovieClip]

            this.removeChild(ui);

                            // callLater causes the function to be called in the _next_ frame.
            callLater(otherfoo);
        }

        private function otherfoo():void
        {
            trace("here");
            mc = null;
            System.gc();
            System.gc();

            for (var obj:Object in dic)
               trace(obj);    //this prints [MovieClip]

        }
    ]]>
</mx:Script>
</mx:Application>

다른 팁

여기서 예제 코드에서 Movieclip을 사전에 추가하지는 않지만 int 12를 대신에 추가하지 않습니까? 아마 오타 일 것입니다.

사전에 현재 무대에있는 내용 목록을 갖기를 원한다면, 이벤트를 듣는 대신 UTIL 클래스를 사용하지 않는 이유는 무엇입니까? 사전은 무대에서 제거되면 참조를 자동으로 삭제하지 않습니다. 또한이 경우 GC는 이것과 관련이 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top