2011-09-01 9 views
0

나는 무비 클립이나 무대에 스프라이트를 확장하는 객체를 추가, 나는 내가 파괴하는 방법을 필요로 수행 단계에서 해당 개체를 제거하면 경우 :쓰레기 수거 문제 (표시 목록 + 액션 스크립트)

  1. 해당 객체에 연결된 이벤트 리스너가 없습니다
  2. 해당 객체에 표시 객체를 추가 했습니까? (obj.addChild (whatever) -> 표시 목록에서 객체를 제거 할 때 "무엇이든"을 제거해야합니까? 아니면 중복됩니까?)
  3. 해당 객체와 관련된 모든 인스턴스 변수 - null로 할 필요가 있습니까?

답변

2

부모 개체에 대한 모든 참조를 제거하는 경우 이러한 자식 개체에 대한 외부 참조가 없다고 가정하고 자식 DisplayObjects를 제거하거나 멤버 변수를 null로 지정할 필요가 없습니다.

플래시는 "마크 스윕"가비지 수집기를 사용합니다. 가비지 수집에 적합한 객체를 확인하기 위해 Flash는 최상위 Stage 요소에서 시작하여 찾은 모든 참조를 가로 지르며 진행되는 동안 객체를 표시합니다. 표시가없는 모든 오브젝트는 도달 할 수 없으므로 가비지 콜렉션을 사용할 수 있습니다.

블랙 박스 개체를 상상해보십시오. 이 상자에 대한 모든 참조를 제거하면 가비지 수집 대상이됩니다. 이제이 블랙 박스에는 실제로 그 내부에 많은 하위 오브젝트가 있음을 상상해보십시오. 부모 블랙 박스와 자식 객체 사이에 참조가있을 수 있지만 블랙 박스 자체가 액세스 할 수 없다는 사실은 변하지 않으므로이 "내부"참조는 모두 중요하지 않습니다. 이러한 개체는 가비지 수집 대상입니다. 나뭇 가지 자체에 많은 분지와 작은 포크가있을지라도 나무에서 가지를 잘라 냈습니다. 우리가 obj과 그 하위 구성 요소를 정리하려면 어떻게

var obj:MySprite = new MySprite(); 
obj.foo = new Foo(); 
obj.addChild(new Sprite()); 
addChild(obj); 

:

다음은 간단한 예제?

removeChild(obj); 
obj = null; 

지금 obj에 접근 할 수없는, 그래서 하위 구성 요소는 다음과 같습니다 모든 필요의 것입니다. 그들은 모두 가비지 수집 대상입니다.

는하지만,이 자식 개체에 대한 외부 참조가있는 경우는주의해야한다 :

var obj2:Sprite = new Sprite(); 
obj.addChild(obj2); 
obj = null; 

을 우리가 obj을 널링에도 불구하고, 우리는 obj2을 null로 잊고, 그래서는 가비지 컬렉션되지 않습니다. 부모 obj 개체는 obj2.parent을 참조하기 때문에 가비지 수집되지 않습니다. obj이 블랙 박스 인 경우 obj2에 대한 참조는 블랙 박스 안쪽을 가리 킵니다.

따라서 개체를 정리할 때 특히 개체가 명확하지 않은 혼란스러운 상황에서 개체를 없애고 제거하는 것이 좋습니다. 제거하면 항상 안전 할 수 있지만 불필요한 코드가 작성 될 수 있습니다.

무슨 일이 일어나고 있는지 살펴 보려면 Flash Builder, FlashDevelop 또는 FDT의 프로파일 러 도구를 사용하여 메모리 사용량을 확인하는 것이 좋습니다. 이러한 아이디어를 테스트하려면 System.gc() 호출을 사용하여 GC를 디버그 모드로 강제 실행하십시오.

관련 문제