출처
http://ddongkang.tistory.com/83#recentTrackback
package
{
02.
03.
import
flash.display.MovieClip;
04.
import
flash.display.Sprite;
05.
06.
/** * @author kang */
07.
08.
public
class
ResourceTest
extends
Sprite {
09.
10.
public
function
ResourceTest() {
11.
12.
var
mc : MovieClip =
new
MovieClip();
13.
14.
addChild(mc);
15.
16.
mc.addEventListener(Event.ENTER_FRAME, onEnterframeHandler);
17.
18.
}
19.
private
function
onEnterframeHandler(event : Event) :
void
{
20.
21.
trace
(
"execute event"
);
22.
23.
}
24.
25.
}
26.
27.
}
1.
private
function
disposeMc(_mc:MovieClip):
void
{
2.
if
(_mc.parent !=
null
)
3.
_mc.parent.removeChild(_mc);
4.
_mc =
null
;<br>
5.
6.
}
1.
addEventListener()메서드
2.
3.
public
function
addEventListener(type:
String
, listener:Function, useCapture:
Boolean
=
false
, priority:
int
=
0
, useWeakReference:
Boolean
=
false
):
void
이와 비슷한 경우가 MovieClip을 사용할때 발생할 수 있다. 예를 들어 다음과 같이 1~40frame까지 계속
루
프를 도는 MovieClip이 있다고 하자. 이렇게 루프를 돌고 있는 도중 갑자기 이 무비 클립을 메모리 상에서 제거 하면 어떤
일이 발생 할까?? 결과는 위 ENTER_FRAME 이벤트에서와 같이 계속 루프를 도는 현상이 발생한다. 계속 루프를 돈다는
것은 그 만큼 CPU를 사용한다는 말이 되고, 메모리 낭비를 하고 있다는 말이 된다. 하지만, 이걸 인식 하지 못하고 그냥
MovieClip만 제거 하면 해당 무비 클립에 대한 모든 것들이 메모리 상에서 없어 진다고 잘 못 생각하고 있는것이다.
그러므로 위와 같이 MovieClip을 사용한 작업을 할때는 꼭 MovieClip을 stop() 해 준뒤에 메모리를 해제 해
줘야 한다. stop 해주지 않고 메모리를 해제 했다간, 모든 참조 값들이 사라 졌기 때문에 해당 타임라인을 멈출 수 있는
방법이 존재 하지 않는다.
이
러한 리소스 관리 문제는 위의 두가지 경우에만 국한된 것이 아니다. AS에서 제공하는 Sound 나 Loader를 이용한
이미지로드 및 SWF 로드 또는 Video 작업을 할때 모두 위와 같은 메모리 문제가 발생 할 수 있다. 이 사실을 항상
유념하고 Flash 작업을 해야 한다. 더 자세한 AS3에서의 메모리 관리 방법은 다음 링크를 통해 확인 하길 바란다.
예제다운로드
아무리 여러 테스트가 있어도, 정답은 "상황에 따라 맞는 방법을 쓴다." 이네요.