2009-06-30 5 views
2

개체가있을 때 그 개체에 대한 모든 참조를 제거하면 가비지 수집기에 등록하기에 충분하며 적어도 들었습니다. 문제는이 객체의 인스턴스를 내부에 만들어진 이벤트 리스너는 자동으로 제거되는 것을 의미 않기 때문에 예 :개체에 대한 모든 참조를 제거하면 해당 개체의 이벤트 리스너가 제거됩니까?

removeChild(object); 
object = null; 

나는,하지만 여전히 조금 혼란 스러워요? 아니면 내가해야 할 일이 있습니까?

답변

7

아, 당신은에 명중했습니다 관리 코드에서의 메모리 관리의 핵심 : 여러분이 객체이고 다른 객체에 대한 참조를 가지고 있다면 (심지어 그것이 오직 이벤트 리스너의 형태로 존재할지라도), 그 객체가 존재하지 않을 것이라는 적어도 하나의 이유가 있습니다 GC 동안 메모리에서 제거되었습니다.

표시 객체에 대한

, 내 경험에 거의 언제 당신이 이벤트 디스패처에 가입하고 싶지만 하지 당신이 약한 참조 옵션을 사용하여 이벤트 리스너를 추가해야합니다, 그 디스패처의 나머지 메모리에 대한 책임 :

myPublisher.addEventListener("myEvent", myHandlerFunction, false, 0, true); 

은 거의 모든 상황에서 나는 "약한 참조를 사용"요즘, "거짓, 0, 진정한"(진정한 의미가 발생하고이 리스너를 추가 "로 느슨하게 번역하는,하지만하지 않습니다 디스패처가 메모리에서 지워지지 않는 이유 "- 자세한 정보는 문서 참조)는 e를 추가하는 적절한 방법입니다 통기 청자. 아주 약간의 교과서 나 문서 스 니펫은 어떤 이유로이 접근법을 보여 주지만 훨씬 직관적 인 메모리 관리 경험을하기 때문에 불행합니다. 예외가 아닌 규칙으로 사용하는 것이 좋습니다.

희망 하시겠습니까?

+1

+1 - 그렇지만, 예, 약한 청취자로 등록하지 않는 한 이벤트 리스너 등록은 등록되지 않은 상태에서 GC'ed 상태로 유지됩니다. – fenomas

0

당신이 고려해야 할 중요한 점은 객체 O가 이벤트 핸들러를 가지고 있다면 (예 : E에 이벤트 핸들러로 추가 된 메소드), 이는 참조로 간주됩니다 ... 약한 참조로 핸들러를 추가하지 않으면 ...

당신은 누구의 외부 범위 O에 대한 참조를 포함하는 폐쇄가있는 경우

또한, 다음이 참조 ... 당신도 GC를 위해 그것을 가입, O에 대한 모든 참조를 제거 할 필요가 없습니다

입니다. .. GC는 또한 순환 참조를 제거합니다 ... 내장 된 객체의 "대륙"(예 : 타이머, 표시 목록, I/O)에만 연결된 "반도"만 메모리에서 모든 "섬"을 제거합니다. 레이어 등 수집되지 않습니다 ... O는 GCD를 얻는 경우에 그들에게 또 다른 참조 ... 등이없는 한

조금이 주제와 another post of mine 거래의 마지막 단락 ...

그래서 그래, 기본적으로 다음 모든 이벤트 핸들러는 GCD를 얻을 수 도움을 주었다.

희망 ... :)

greetz

back2dos

+0

비록이 객체의 이벤트에 대해 말하는 것이 아니며,이 객체의 이벤트 리스너에 대해 말하고 있습니다. – Tom

관련 문제