Movieclip은 사전에서 제거되지 않습니다
-
03-07-2019 - |
문제
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는 이것과 관련이 없습니다.