2013-05-08 1 views
1

나는 스테이지에서 추가 할 필요가있는이 세 가지 객체를 프로그램의 나중 단계에서 배열에서 추출 할 때 사용합니다.배열에서 인스턴스화

누군가가 저에게 전에 말했기 때문에 var mall: Mall = new Mall();을 쓸 수 없습니다. 이것은 메모리에있는 객체에 추가되며 많은 객체가 처리되면 정말 좋지 않을 것입니다. 나중에 더 많은 객체를 사용하게 될 것입니다.

그래서 내가 루프 또는 이벤트 리스너를위한 프로그램을 실행할 때 내가 객체의 인스턴스를 만들기 위해하는 AddChild 전화를 자동으로 ... = new object();을 추가 할 수있는 방법을 알고 싶습니다. 가비지 컬렉션

var mall:Mall; 
var library:Library; 
var music:Music; 

var choices:Array = new Array(); 

choices.push(mall,library,music); 

테스트 코드 :

var waking: WakingUp = new WakingUp(); 
addChild (waking); 
waking.y=-30; 
waking.addEventListener (Event.ENTER_FRAME, waking_up); 
function waking_up (g:Event){ 
if (waking.currentFrame == waking.totalFrames) 
{ 
    waking.stop(); 
    waking.removeEventListener (Event.ENTER_FRAME,waking_up); 

     removeChild (waking); 
     removeChild(alarm_slide); 


     gotoAndStop (6); 


} 

} 

이이 코드에있는 모든 심판이다, 그것을

답변

1

하는 AddChild이 개체의 인스턴스를하지 않습니다 D 현재 디스플레이 컨테이너의 표시 목록에 객체를 간단히 추가합니다.

new Mall()을 사용하는 것은 좋습니다. 가비지 수집 될 수 있도록 더 이상 필요하지 않을 때 참조를 제거하십시오. 또는 프리미티브 배열을 보유 할 수도 있습니다. 요소 배열의 인스턴스에 특정

+0

제가보기에 : D는 내가 어떻게 refernce를 제거 할 수 있습니까? 그러나 그것이 남아있을 확실한 어떤 물건을 갖게 될 것이기 때문에 그것은 또한 나쁘다. 그래서 나는 어떤 것을 제거 할 것인지 그리고 어떤 것을 제거 할 것인지를 말할 수 없을 것입니다. – tailedmouse

+0

개체에 대한 이벤트 수신기를 제거하고 배열에서 제거합니다. 어떤 것을 제거해야하는지 알 수없는 이유는 무엇입니까? – Montycarlo

+0

아, 그래서 가비지 컬렉터가 청취자를 제거하면 그것을 잡을 수 있을까요? 나는 그것을 무효화 할 필요가 없을 것이다. – tailedmouse

3

수행 할 수 있습니다

var choices:Array = [ mall, library, music ]; 

플래시 플레이어 런타임이 마크와 청소뿐만 아니라 계산을 모두 참조를 사용합니다.

인스턴스에 대한 모든 참조는 인스턴스가 참조 해제 될 때 count - collections, display list, event listener, 클래스 멤버를 추가하므로 메모리가 궁극적으로 해제됩니다.

참조 횟수

힙에 각 객체가 가리키는 사물의 수를 추적합니다. 개체에 대한 참조를 만들 때마다 개체의 참조 횟수가 증가합니다. 참조를 삭제하면 개체의 참조 횟수가 감소합니다. 개체의 참조 번호가 0 ( ) (아무 것도 가리키고 있지 않음) 인 경우카운트 테이블 (ZCT)에 0이 추가됩니다. ZCT가 꽉 차면 스택이 스캔되어 스택에서 ZCT의 객체에 대한 참조가 모두 입니다. 에있는 모든 객체는 스택 참조가없는 ZCT가 삭제됩니다.

지연 참조 카운팅의 문제점 중 하나는 순환 참조입니다. ObjectA와 ObjectB가 서로를 참조하지만 시스템의 다른 객체가 해당 객체를 가리 키지 않으면 절대 참조 수가이 아니므로 참조 카운트를 사용하는 가비지 수집에 적합하지 않습니다. 여기서 마크 및 스윕 가비지 수집이 도움이됩니다.

마크/Flash Player에서 실행하거나 AIR 여러 GCRoots이

응용 프로그램을 쓸어. GCRoot를 트리의 트렁크로 생각하면 애플리케이션의 오브젝트가 브랜치로 간주됩니다. 스테이지는 GCRoot입니다. 로더는 GCRoot입니다. 특정 메뉴는 GCRoot입니다. 응용 프로그램에서 아직 사용중인 모든 개체는 응용 프로그램 내의 GCRoot 중 하나에서 접근 할 수 있습니다. GCRoot는 결코 가비지 수집되지 않습니다.

응용 프로그램의 모든 객체에는 "마크 비트"가 있습니다. 가비지 콜렉션의 마크 단계 이 시작되면 해당 마크 비트가 모두 지워집니다. MMgc는 응용 프로그램의 모든 GCRoot를 추적합니다. 쓰레기 콜렉터는 해당 루트에서 시작하여 각 개체를 추적하고 도달하는 모든 개체에 대해 마크 비트를 설정합니다. 더 이상 의 루트에서 접근 할 수없는 객체는 응용 프로그램에서 어디서나 접근 할 수 없습니다. 마크 비트는 단계에서 설정되지 않습니다. 수집기가 찾은 모든 객체를 마킹 한 후에는 스윕 단계가 시작됩니다. 설정된 마크 비트가없는 객체는 모두 이며 메모리가 회수됩니다.

+0

아히하, 이것은 매우 유용하다. 이걸 공유해 주셔서 고맙습니다. 내 응용 프로그램에 많은 메모리 누수가 발생했습니다. 이제 이유를 알았습니다. 그래서 그냥 이해를 확인하기 위해, 내 질문에 코드의 작은 조각을 업로드 할 수 있습니다 가비지 수집됩니다 말해 줄래? – tailedmouse

+1

예제에서 'waking'은 모든 참조가 제거됨에 따라 삭제되어야합니다. 즉, 표시 목록에서 제거되고 이벤트 리스너가 제거됩니다. Flash Builder에는 현재 및 누적 인스턴스를 볼 수있는 프로파일 러가 있으며 Flash Pro에는 [Scout] (http://www.adobe.com/devnet/scout/articles/adobe-scout-getting-started.html)이 있습니다. 응용 프로그램의 프로필 메모리를 지원합니다. –

+0

오 이런 유용한 도구입니다. 이 점을 가르쳐 줘서 고마워. – tailedmouse