티스토리 뷰

CCArray를 생성하는 방법은 보통 다음과 같다.


CCArray *pArray = CCArray::create();


혹은


CCArray *pArray = CCArray::createWithObjects( obj1, obj2, NULL );


보통 이렇게 생성할 것이다. 하지만 이렇게 CCArray를 생성한 뒤 나중에 Array에 addObject를 하려고 하면 에러가 난다. 이것을 해결하기 위해선 위 소스를 다음과 같이 바꿔주면 된다.


CCArray *pArray = CCArray::create();

pArray->retain();


혹은


CCArray *pArray = CCArray::createWithObjects( obj1, obj2, NULL );

pArray->retain();



이런 실수는 레퍼런스 카운터의 개념을 이해하지 못하여 발생하게 된다. create~ 함수 내부에는 autorelease를 자동으로 실행하는데, autorelease 함수 내부에서 객체의 레퍼런스 카운터를 1 감소시키는 작업을 한다. cocos2d-x의 컴포넌트들은 autorelease pool에 의해 관리되는데, 매 프레임마다 레퍼런스 카운터가 0인 객체를 삭제해주는 작업을 한다. 그렇기 때문에 retain 함수를 실행함으로써 레퍼런스 카운터를 1 증가시켜주지 않으면 나중에 array에 객체를 추가하려고 할 때 array가 존재하지 않는 상태가 되어 에러가 발생하는 것이다. 말은 어렵지만 한 마디로 retain을 해줘서 객체가 사라지지 않게 해줘야 한다는 것으로 알고 있으면 된다. 당연히 해당 scene이 종료되면 array를 따로 정리해줘야 메모리릭이 발생하지 않는다. retain으로 인해 레퍼런스 카운터가 1 증가하였기 때문에 따로 release를 하지 않으면 메모리상에 그대로 남아있기 때문이다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday