혹시 플래시나 플렉스를 하는 사람중에 GSkinner를 모르는 사람이 있다면,
GSkinner는 그 이름 앞에 Honorable을 붙일 정도로 플래시 커뮤니티에서는
renowned expert이다.
개인적으로 플래시 커뮤니티에서 3대 거장을 뽑자면,
Colin Moock, Grant Skinner, Robert Penner를 뽑겠다.
(플래시의 easing equation은 모두 Robert Penner의 라이브러리에서 나왔다.)
아무튼,
플래시 플레이어 10 API에는 Loader 객체에 unloadAndStop() 메서드가 추가됐는데,
이게 하는 일이 뭔지에 대해 혹자는 잘못 이해할 수도 있을 거 같다.
그래서 정리한다.
예전에는,
Loader로 swf를 불러올 때 unload()를 하더라도
계속해서 사운드가 들리고 엔터프레임 이벤트가 진행되고 했더랬다.
이 부분을 자동으로 unloadAndStop() 메서드가 처리해 주겠다는 것이다.
그러니까, 로드된 컨텐트에서
사운드가 재생중이면 사운드를 멈추고,
엔터프레임이 진행중이면 엔터프레임 이벤트를 제거하고,
Timer 객체가 있으면 타이머를 중단시키고
무비클립이 실행중이면 무비클립을 멈추고
stage 이벤트가 걸려있는 게 있으면 이것도 모두 제거하고
소켓 통신, xml 소켓 통신, 파일 레퍼런스에 의한 다운로드가 있으면 이것도 중단시키고
cacheAsBitmap/filter 와 관련한 비트맵도 알아서 제거해 준다는 거다.
그럼 왜 이렇게 해 주는데...? 하고 물을 수 있는데,
그래야 가비지 컬렉션이 일어나기 더 좋은 상황이 되니까....
이렇게 하면 그래도 메모리 누수나 필요없는 코드가 돌 확률이 적으니까~
라고 답할 수 있겠다..
그렇다고 "unloadAndStop() 메서드를 호출하면 바로 해당 자식이 가비지 컬렉션이 되냐?"고 물으면
꼭 그건 아니다...
GC 로직은 바뀌지 않았다 (적어도 내가 알고 있는 한)
다만... GC에 보다 적합한 상태로... 자동으로 언로드된 컨텐트를 만들어 준다는 거다.
예를 들어, 예나 지금이나 저 위의 것들을 해 주지 않으면
해당 컨텐트는 GC의 대상이 되지 못한다.
다시 말해, GC의 대상이 되기 위해서는 위의 것들을 하나도 빠짐없이 몽땅 해 주어야 한다.
그런데, 개발자가 일일히 하나 하나 찾아서 저걸 다 해준다는 게 쉽지 않았다.
그래서 이런 새로운 메서드가 GSKinner의 강력한 요청에 의해서 나온 것이다.
그럼 왜 unload() 메서드에 이런 내용을 지원하지 않고
새로운 메서드를 만들었느냐고 물을 수 있는데,
이 부분은 하위 버전과의 호환성을 고려해 그렇게 했다고 한다...
사실 unloadAndStop() 메서드로 인해 어떤 문제들이 생길 수도 있다.
예를 들어, 기존 코드에서 언로드된 컨텐트를 참조하는 레퍼런스가 있다가
갑자기 null을 참조하게 된다든지..
P.S: 흠.. 쓰다보니 글을 번역하는 꼴이 됐네... ㅡ.ㅡa





