2011-07-26 4 views
0

저는 Actionscript 2.0에서 Actionscript 3.0으로 전환 중이며 몇 줄의 핵심 코드가 누락되었습니다. 이 전 미사일을 가지고 있다고 가정 해 봅시다, 그리고 화면을 떠날 때, 액션 스크립트 2에, 난 그냥 ActionScript 3.0에서을 사용하면 코드가 계속 실행되는 이유는 무엇입니까?

removeMovieClip(this); 

을 사용, 나는이

parent.removeChild(this); 

문제가 사용되어 있다고 생각 , 코드는 여전히 실행됩니다. 예를 들어 프레임 1에 추적 코드가 있고 프레임 30에이 코드가 있습니다. 그런 다음 프로그램을 실행하면 프레임 1이 실행되고 개체는 "사라질"것입니다. 그런 다음 추적이 다시 발생하고 프레임 30 다시 돌아 오면 TypeError가 발생합니다. Error # 1009 : null 개체 참조의 속성이나 메서드에 액세스 할 수 없습니다.

그래서 내가 뭘 잘못하고 있니?/etc를 제대로 삭제하지 않습니까? 나는 이것과 비슷한 몇 가지 질문이 있다는 것을 알고 있지만, 나는 그들이 찾고있는 해답이없는 것 같다. 미리 감사드립니다.

+0

try this = null 제거한 후에 부모로부터 처리해야하므로 this.removeChild (child); 자식 = null; –

+0

removeFromStage에 대한 eventListener를 추가하여 해당 객체에 대한 정리 작업을 수행하고 그 객체에서 실행중인 모든 작업을 중단 할 수도 있습니다. 그때 어떻게 든 그것을 밖으로 null. 이것은 결국 OOP이며 객체는 자체적으로 처리해야합니다. 부모보기에서 수행해야하는 nulling을 제외하고. –

+0

비슷한 질문에 대한 답을 확인하고 싶을 수도 있습니다. http://stackoverflow.com/questions/6792291/reference-a-movieclip-symbol-later-on-in-the-timeline '루트'에 존재하지 않는 객체 (일명 MC의 프레임 1). – Alex

답변

1

디스플레이에서 표시 객체를 제거해도 객체가 삭제되지 않습니다. 개체를 수동으로 파괴해야합니다. 여기에 표시 객체를 추가하고 제거하는 그림이다 :

var mc:MovieClip = new MovieClip(); 
addChild(mc); 
trace(mc); // traces [Object MovieClip] 

removeChild(mc); 
trace(mc); // traces [Object MovieClip] 

mc = null; 
trace(mc); // traces null 

반드시 그것을 파괴하지 않는다 "널 (null)"에 객체를 설정, 명심하십시오. 코드에서이 객체에 대한 이벤트 리스너 또는 참조가있는 경우 Flash는 여전히이 객체를 메모리에 유지합니다. 이 경우 객체에 "파괴"기능을 생성하고자 할 것입니다. 이 함수는 객체에 대한 참조를 제거하고 이벤트 리스너를 제거합니다.

+0

올바른 설명 (* 디스플레이에서 표시 객체를 제거해도 객체는 삭제되지 않습니다. *), 그러나 엄청난 그림입니다. –

+0

이것은 다소 옳다. 모든 참조가 null이면 코드 실행이 중단되지 않고 가비지 콜렉션을받을 자격이 생기고 일부 미정의 시점에서 발생한다. 코드는 GC가 실행될 때까지 계속 실행됩니다. –

+0

이것은 매우 단순한 그림을위한 것입니다. 이 예제의 MovieClip 객체에는 코드가 실행되지 않습니다.내 대답에서 언급했듯이 null로 설정하면 코드를 실행하거나 객체에 대한 참조가있는 경우 작동하지 않습니다. – Corey

0

ActionScript 코드는 가비지 수집기에서 객체를 정리할 때까지 계속 실행됩니다. 코드를 중지하려면 코드 실행을 유발하는 요소를 명시 적으로 중지해야합니다. enterframe 이벤트에 의존하는 경우 동영상 클립 (myMovieClip.stop())을 호출하면 리스너를 제거하면됩니다.

+0

답변 해 주셔서 감사합니다. 이제는 1) 미사일의 x와 y 좌표를 -9999로 설정하고 2) parent.removeChild (this), 3) stop() 및 EnterFrame 리스너를 제거합니다. 그리고 나중에 같은 이름의 아이를 다시 추가하고 싶다면 문제없이 작동 할 것입니다. 그렇죠? – Bao

+0

올바른 경우 나중에 원할 경우 다시 추가 할 수 있습니다. 그런 다음 다시 play()를 호출하여 다시 시작해야합니다. x/y를 변경하는 것은 실제로 불필요한 단계이지만 다른 이유로이 작업을 수행 할 수도 있습니다. –

+0

@Bao 귀하의 요점에 대해서 2) - 일반적으로 나는 아이를 추가 할 책임이있는 클래스를 디스플레이리스트에 놓아 두어야한다고 생각합니다. 그렇게하면 코드의 흐름을 따라 가고 무슨 일이 벌어지고 있는지 이해하는 것이 훨씬 쉬울 것입니다. 'isDead'와 같이 어떤 종류의 플래그를 변경하고 부모 클래스를 찾아서 적절하게 자식을 제거하도록하면됩니다. 부모 클래스가 자식 클래스의 리스너를 보유하는 경우 특히 중요합니다. – Bakapii

0

무비 클립에 이벤트 리스너가 연결되어 있지 않아야합니다. 또한 무비 클립에 대한 참조 (배열 또는 다른 객체)가 없는지 확인해야합니다. 무비 클립 자체를 제거하려면 mc = null라고해야합니다.

그렇지 않으면 FlashPlayer가 클립을 메모리에 유지하며 이미 표시 목록에서 제거 된 경우에도 영원히 존재합니다.

관련 문제