인스턴스 삭제 처리하는 법?
수리
PV3D를 이용하여 간단한 게임을 구현하고 있는데 문제가 있어서 질문 올려요
일단 기본 형태가 간단하게 보면 이렇습니다.
A클래스(Document Class) extends Sprite
B클래스(GamePlay Class) extends BasicView
A에는 메뉴가 깔려있고 Start를 누르면
gamePlay = new B(this);
addChild(gamePlay);
이런식으로 실제 플레이 부분을 불러옵니다.
B에는 메인으로 가는 버튼이 있고 그걸 누르면
다시 A클래스의 init()메소드를 호출합니다.(init()에선 메뉴화면 깔고 이벤트리스너 등록만 함)
B의 생성자 인자가 A클래스 주소니까 저 값을 넣은 변수.init() 으로 해서 A의 인스턴스의 init()을 호출하죠
여기까지 해보고 테스트를 하니 B에서 메인 누르면 다시 돌아가는 것까지 잘 됩니다.
그리고 Start를 누르면 다시 시작되는 것도 되는데, 문제는
이전의 B 인스턴스가 그대로 남아있다는 것입니다.
전 gamePlay = new B(this); 이 부분에서 기존의 것을 지우고 새로 만든다라고 생각을 했는데 그게 아니었나 봅니다.
그래서 질문은
1. 저런 경우에도 인스턴스 삭제를 꼭 해줘야 되는 게 맞나요?
한 멤버번수에 새로 생성하여 넣는 건데도 어째 예전 께 남아있는지..
2. 삭제해야된다면 어떤 기준으로 해야되는지요?
DisplayObject류만 하면 되는 걸까요?(저같은 경우 DisplayObject3D류도 있겠군요.)
어떤 기준으로 하는 건지..;
3. 자식 인스턴스들을 쉽게 삭제하는 방법이 있나요?
일일히 부모.removeChild(자식) 한 후 자식 = null; 이런식으로만 해야되나요?
중복 for돌려가면서 자식들 찾아서 지우게 할순 있겠지만 이것도 좀 아닌것 같아서..
그냥 최상위 객체만 null 줘버려도 자식들은 남나요ㅡㅡ?쉽게 요약하면
gamePlay= new B(); 를 반복하면 B클래스의 3D Object가계속 늘어간다는 거죠. 덮어씌워지는 게 아니라..
쿡북 책 하나 있는데 전혀 언급이 없네요
답변 부탁드립니다~
-
후예
1. 당근겹쳐지면 안되죠...겹쳐지게 된다면..똑같은 객체를 여러개 만들고 싶을때...쓸수가 없겠죠;;;
2. 디스플레이오브젝트도 지우셔야하구...타이머 같은것도 지우세요...화면상에 addChild 안되어있어도....어디선가 참조하고 있으면 안지워질꺼에요..(그리고 DisplayObject3D 도 아마 DisplayObject를 상속받아서 만든걸껍니다...)
3.제가 알기론 자식값을 어디선가 참조하고 있으면 GC가 안날린다는걸로 알고 있습니다..( -
알찬마루
1. 삭제가 안됩니다. 고로 변수에 다른 값을 대입하기전에 충분한 처리(삭제등)을 해줘야 합니다.
변수에 새로운 값을 넣는다고 해서 전 값 자체가 없어지지 않습니다(저 경우 레퍼런스 참조임, 스트링, 인트 뭐 이런거만 값 참조입니다)
2. 화면상 보이는거라면 removeChild 해주시면 되고 기타 일반 클래스나 어레이 같은 것들은 기존 하시던대로 변수에 다른값 넣고 사용하시다보면 gc가 알아서 지워줍니다
단, 디스플레이 오브젝트가 스테이지에 올라가 -
유희
아 추가로, 플래시엔 플렉스의 Panel 같은 UI클래스는 없나요? Dialog 하나 띄울려는데 (자바스크립트로 따지면 Confirm이나 Alert같은 거요) 일일히 구현해야되는지..