2012-06-14 3 views
0
public class MyButton extends Sprite 
{  
    public function MyButton(defaultHandler:Function)  
    {  
     addEventListener(MouseEvent.CLICK, defaultHandler);  
    } 
} 

// Main 클래스AS3 : 메모리 누수가 발생합니까?

var myButton:MyButton =new MyButton(someFunction); 
addChild(myButton) 

removeChild(myButton); 
myButton = null; 

IE가 무대에서 제거 될 때 나는 그것을 제거 구체적으로 구축 될 때 안에 내 버튼 클래스에서 익명의 마우스 클릭 이벤트 핸들러 함수를 추가하지 오전 밖으로 nulled.

이 개체가 가비지 수집기에 적합합니까? 그렇지 않으면 메모리 누수가 발생하지 않습니까? 또는 그 이후로 이벤트 리스너는 제거 된 객체를 참조하는 것일뿐입니다. ???

답변

1

Button 인스턴스의 이벤트 리스너는 사용자가 특별히 수신기를 제거하지 않거나 수신기가 약한 참조가 될 때까지 가비지 수집되지 않도록합니다.

addEventListener(MouseEvent.CLICK, defaultHandler, false, 0, true); 

마지막 인수 true는 매개 변수 useWeakReference을 위해 전달됩니다.

의 useWeakReference : 다음 docs에서 (기본값 = false)를 부울 - 리스너에 대한 참조가 강한 지 아니면 약한지를 결정합니다. 강력한 참조 ( 기본값)는 청취자가 가비지 수집되지 않도록합니다. 약함 참조가 아닙니다.

+0

약한로 리스너를 설정, 제거하는 책임이있다 쓰레기 수집기로 옮겼습니다. GC를 믿어서는 안됩니다. 대부분 랜덤하기 때문에 시간이 좀 걸릴 수 있습니다. 약한 청취자는 자신의 코드를 정리할 책임이없는 게으른 개발자를위한 것입니다. 유일한 예외는 무대에있는 이벤트 리스너 일 수 있지만 항상 청취자를 직접 제거해야합니다. –

+1

Agreed @ MarkKnol, 나는 항상 명시 적으로 그것을 제거합니다.즉, OP가 요구하는 것이 아닙니다. – sberry

+0

약간 다른 시나리오이지만 비슷한 문제가있는 이걸 찾았습니다. 따옴표가있는 http://stackoverflow.com/questions/8471578/would-this-code-cause-memory-leakage : "useWeakReference 매개 변수가 true로 설정되어 있지 않으면 가비지 수집기가 ** 디스 패칭 개체가 존재하는 한 ** 청취자를 제거하지 않기 때문에 이벤트 리스너가 메모리에서 자동으로 제거되지 않습니다." - 이렇게하면 청취자가 참조하는 객체가 ** 더 이상 존재하지 않는 ** 유지해야하고 누출이 발생해서는 안됩니다 - 누구든지 확인할 수 있습니까? –

1

@ sberry의 답변에있는 내용이 완전히 유효하지만이 시나리오에서는 서로 어떤 개체가 서로 참조되어 있는지 자세히 살펴보십시오. 메인 클래스는 응용 프로그램의 수명에 대한 주위의 경우

는 전혀 기억이을 누설하지가 :

메인 클래스는 인스턴스화하는 버튼 클래스에 대한 참조를 가지고있다.

단추 클래스에는 이벤트 처리 함수의 주 클래스에 대한 참조가 있습니다.

메인 클래스는 버튼에 대한 참조를 null로 만듭니다.

이 시점에서에 대한 더 이상의 참조는 없으며 입니다. 버튼은 일 수 있으며 가비지 수집됩니다.

메인 클래스가 앱의 수명 동안 정말로 존재한다면 아무런 문제가 없습니다. 어떻게 든 메인 클래스가 사라지고 버튼 객체 중 하나가 지속되면 당신은 메모리 누수가 있습니다 (이 버튼은 메인에 대한 참조를 유지하며 메인은 가비지 수집 될 수 없습니다).

PS : 나는 이벤트 리스너를 제거 할 때 또는 약한 참조를 사용에 대해 주장하고 있지 않다, 나 자신은 가능한 한 많은 사람들 관행을 모두 할 :)

+0

네, 이것은 객체 자체가 더 이상 존재하지 않는다면, 이론적으로는 이벤트 리스너도 존재하지 않는다는 것을 의미합니다. 누구든지 확인할 수 있습니까? –

+0

내가 말한 것을 뒷받침하는 [Adobe의 기사] (http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html). 가비지 수집은 두 가지 방식으로 작동합니다. 참조 횟수 (빠름)와 순환 횟수 (순환 횟수)가 0이 아닌 항목을 '마크 및 스윕'으로 잡습니다. 귀하의 예제에서, 당신이 할 때 버튼에 대한 참조 카운트는 0이됩니다 :'removeChild (myButton); myButton = null; '단추가 가비지 수집 대상이되지만 상황이 발생할 때 보장 할 수는 없습니다. –

+0

버튼에'addEventListener()'를 사용하면 단추는 기본적으로 해당 이벤트를 함수 (이 경우 기본 클래스에 정의 됨)에 매핑합니다. 따라서 버튼이 눌려지면이 매핑이 함께 진행되며 이벤트 리스너가 더 이상 존재하지 않는 것으로 간주 될 수 있습니다. 청취자를 추가하거나 약한 참조를 추가 할 때는 청취자를 제거하거나 사용하는 것이 좋습니다. –

관련 문제