티스토리 뷰

이거 때문에 삽질을 해서..... 다른 사람들은 이 글을 보고 삽질을 겪지 않길 바란다.

이 autorelease() 메소드 이름을 보면 알겠지만 이 메소드를 호출한 객체는 굳이 메모리 해제를 하지 않아도 되는 객체가 된다.
그런데 나는 autorelease()를 걸어둔 메소드들을 delete 했고
이것은 게임을 종료할 때 에러창이 뜨는 요인이 되었다.

autorelease() 메소드 구조가 어떻게 되어 있고
release() 메소드가 있는 클래스들의 구조가 정확히 어떻게 되어 있는지는 모른다.
단지 레퍼런스 카운터로 어떻게 어떻게 한다는 것만 알지.
CCObject 클래스를 상속받은 객체들은 메모리 해제를 할 때 모두 release를 하는 방식인데(CCObject에 선언 되어 있는 메소드이다.)
autorelease() 메소드를 실행한 객체들은  PoolManager를 통해 자동으로 release가 된다.
그런데 내가 autorelease() 메소드를 실행 해 놓은 객체를 Layer가 삭제 될 때 같이 delete를 해버렸고
결국 나중에 release()가 자동으로 호출이 될 때 에러가 나게 된 것이다.

좀 개선이 된다면 autorelease()를 걸어둔 객체들은 delete를 해도 에러가 나지 않게 하면 좋지 않을까 생각해본다.
아니면 autorelease()를 걸어두면 플래그를 생성해서 이 객체를 delete를 할 때 Assert를 날려주던가....

예전에 cocos2d-x 공부할 때도 삽질했던 부분인데 그 때 해결을 못했고 해결 방법도 몰라서
이번에 다시 삽질을 하게 되었다.
이제는 해결 방법을 알게 되었으니 조심해야겠다. 


-수정 사항-
자동으로 삭제가 된다는 것은 CCObject 클래스에 존재하는 레퍼런스카운트라는 변수의 값이 0이 되면 알아서 delete가 된다는 뜻이다.
좀 더 자세히 설명하기 위해 아래의 CCObject 클래스를 봐 주기 바란다.

class CC_DLL CCObject : public CCCopying
{
protected:
// object id
    unsigned int m_uID;
// count of refrence
unsigned int m_uReference;
// is the object autoreleased
bool m_bManaged;
public:
CCObject(void);
virtual ~CCObject(void);
    
virtual void release(void);
virtual void retain(void);
CCObject* autorelease(void);
CCObject* copy(void);
bool isSingleRefrence(void);
unsigned int retainCount(void);
bool isEqual(const CCObject* pObject);

friend class CCAutoreleasePool;
}; 

문제의 녀석이 바로 저 m_uReference라는 변수이다.
이 변수는 여러 함수를 호출시의 값이 증가되거나 감소 한다.

1. 생성자에서 1로 수정
2. release() 호출시 1 감소. (이 때 레퍼런스카운트가 0이하면 자기 자신을 삭제)
3. retain() 호출 시 1 증가
4. addChild로 어딘가에 자식으로 삽입시 1 증가(내부적으로 retain() 호출)


위 내용과 같게 release() 호출 시 레퍼런스카운트를 1 감소 시키고 이 때 레퍼런스카운트가 0이하라면 자기 자신을 삭제한다.
그런데 레퍼런스카운트를 증가시키는 행위의 횟수와 감소시키는 행위의 횟수가 같지 않으면 문제가 되는 것이다.

사실 잘 생각해보면 어려운 문제는 아니다.
어찌되었든 한가지 확실한 것은 CCObject를 화면에 보이기 위해서는 생성하고 자식 객체로 삽입할 것이다. (이때 레퍼런스카운트는 2가 된다.)
그리고 언젠가 객체를 삭제할 것이고 이 때 그냥 객체를 삭제만 하지 말고 부모에게서 removeChild를 해주면 되는 것이다. 



정리를 하자면 이 글에서 일어난 문제는 결국 내가 잘못해서 난 문제이고(-_-;;)
레퍼런스 카운트가 어떤 때에 증가되고 감소되는지를 잘 알고 그 횟수를 같게 하도록 하자!! 이다. 
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday