2012-12-12 3 views
0
package 
{ 
    public class SomeClass 
    { 
     public var myBtn:Button ; 
     public function SomeClass() 
     { 
     myBtn.addEventListener(MouseEvent.CLICK, clickFunction) ; 
     } 

     function clickFunction(e:Event){ 

     } 

    } 

} 

메인 클래스에 대한 몇 가지 의문 지울 : 위에서가비지 컬렉션 (AS3.0)

var someClass:SomeClass = new SomeClass(); // step 1 
addChild(someClass); // step 2 
removeChild(someClass); // step 3 
someClass = null // step 4 

을, 나는 4 단계에서이 널 (null)이 할당 된, 그래서 완전하게 someClass 인스턴스를 파괴하려는 값.

Q1) 4 단계 (null 할당)는 인스턴스를 파괴하는 올바른 방법입니까?

질문 2) 객체에 대한 삭제 키워드를 사용하여 http://gskinner.com/blog/archives/2006/06/as3_resource_ma.html을 참조했습니다. 하지만 delete 키워드를 클래스 인스턴스에 사용할 수 있다고 생각하지 않습니까? 이 경우에는 어떻게 사용합니까?

Q3) SomeClass의 myBtn eventListener는 어떻게됩니까? SomeClass의 인스턴스를 파기하기 전에 removeEventListener를 수동으로 추가해야합니까? 아니면 자동으로 파괴 될까요?

감사합니다.

답변

1

1/예. (someClass 변수가 인스턴스 변수라고 가정합니다.)

2/delete 변수 정의뿐만 아니라 변수 정의도 제거합니다. AS3의 클래스는 일반적으로 봉인되므로 작동하지 않습니다. 나는. delete은 동적으로 생성 된 멤버에서만 사용해야합니다. 주로 Object 또는 Dictionary 인스턴스의 '키' 그러나 분명히 delete을 사용하여 dynamic으로 표시된 클래스의 구성원 정의를 제거 할 수 있습니다.

3/예, 항상 이벤트 수신기를 수동으로 제거하십시오. 핸들러를 리스너로 등록 할 때 약하게 참조되는 이벤트 리스너를 만들 수 있지만, 항상 이벤트 리스너가 수동으로 제거되고 읽기 쉽고 명확하며 오류가 없는지 확인하는 것이 가장 좋습니다.

인스턴스 소유자가 특정 인스턴스에 대한 참조를 정리할 때이 클래스를 호출 할 수있는 모든 클래스에서 destroy 메서드를 사용하는 경향이 있습니다. 이 destroy 메서드는 모든 이벤트 리스너를 등록 취소하고 인스턴스 멤버를 무효화하며 모든 종류의 정리를 수행합니다.

1

생성 한 SomeClass 인스턴스는 더 이상 참조가 없으면 가비지 수집됩니다. 변수를 null로 설정하면 해당 참조가 제거되고 SomeClass 인스턴스는 더 이상 참조가없는 한 가비지 수집됩니다.

위의 코드에서 이벤트 수신기를 제거 할 필요가 없습니다. SomeClass 인스턴스가 수집되면 다른 멤버 변수가 참조되지 않는 한 모든 멤버 변수가 수집됩니다. 단추에 이벤트 수신기가 으로 추가되었으므로 단추를 수집하면 이벤트 수신기가 수집됩니다.

그러나주의 할 점은 myBtn.addEventListener 대신 stage.addEventListener을 사용하면 스테이지에 콜백 함수에 대한 참조가 유지되어 메모리 누수가 발생할 수 있습니다. 리스너를 염려 한 후에도 계속 남아있는 객체에 할당 된 이벤트 리스너는 항상 제거하십시오.

Creynder 님의 조언은 좋은 행동입니다. 습관적으로 이벤트 리스너를 제거하십시오. 그러나 이벤트 리스너의 디스패처가 멈추지 만 콜백이 메모리에 남아 있지 않게하려는 경우에만 필요합니다.

관련 문제