2014-03-27 3 views
0

최근에 문제가 발생했습니다. 나는 STL을 cocos2d-x에 많이 사용했다. 그리고 내 클래스 중 하나에 내가 쓴 :CCArray를 사용하여 cocos2d-x에서 사용자 지정 CCNode를 보유해야합니까?

vector<StrokeDrawnode*> strokedrawList; 

StrokeDrawnodeCCNode에서 상속됩니다. 그러나 일부 문서에서는 CCObject의 하위 클래스를 보유하는 것이 CCArray 인 것이 더 낫다고 말했습니다. 사실, 나는 메모리 관리에 문제가있다. 나는 그것이 문제라고 생각한다. 그래서 내 질문은 어떤 상황에서 사용해야합니까 CCArray 및 어떻게 메모리 관리를 다룰 수 있습니다.

어떤 상황에서 이와 같은 반원을 정의해야합니까?

CC_SYNTHESIZE_RETAIN(CCSprite* , m_sprite_draw, Sprite); 
+0

위키를 읽었으며 많은 것을 알고 있습니다 : http://www.cocos2d-x.org/wiki/CCArray – einverne

답변

1

이 경우 std::vectorCCArray 사이의 주요 차이점은 CCArray에 객체를 추가 할 때이 유지 얻을 것입니다. 이것은 CCObject - retainCount이 0에 도달했을 때 (기본적으로 모든 것) 오브젝트가 파괴되어 코코스에서 정말로 중요합니다. 이것은 모든 프레임 사이에서 자동으로 수행됩니다.

다음 예를 고려하십시오. 5 개의 스프라이트를 만들고 나중에 사용하기 위해 캐싱한다고 가정 해 봅니다 (나중에 나중에 사용하기 위해 화면에 표시되지 않음). (어딘가 init() 방법) 코드 :

for(int i = 0; i < 5; ++i) { 

    CCSprite *vectorSprite = (...); 
    CCSprite *arraySprite = (...); 

    _vector.push_back(vectorSprite); 
    _array->addObject(arraySprite); 

} 

_array->retain(); // < ------- IMPORTANT! 

// end of init method 

우리는 물론 _vector_array는 인스턴스 변수 때 init() 끝 파괴되지 않는 것으로 가정합니다.

다음 프레임을 그리기 전에 어떤 일이 발생하는지는 _vector에 넣은 모든 스프라이트가 파괴 될 것이라는 점입니다. 벡터는 잘못된 메모리 위치에 대한 포인터를 보유합니다.

_array에 넣은 객체는 그렇지 않습니다. 왜냐하면 addObject이이 객체를 유지하기 때문입니다. _array 자체는 그대로 유지되어야하며 그렇지 않으면 파기됩니다 (내용물에 대해 잘 모르겠습니다).

일반적으로 나는 코코스 객체로 작업 할 때 cocos-containers을 사용하는 것이 좋습니다. 모든 객체가 아니라 컨테이너 자체를 기억하는 것만 기억하면됩니다. std::vector을 실제로 사용하려는 경우 std::vector을 서브 클래스 화하면 그 개체의 push_backpop_back 메서드가 각각 retainrealese이되도록 그럴듯 할 수 있습니다. 매크로에 관해서는


- 내가 그것을 사용하지 않은,하지만이로 확장 : 세터와 외부 사용하기 위해 변수에 대한 게터를 생성

#define CC_SYNTHESIZE_RETAIN(varType, varName, funName) \ 
private: varType varName; \ 
public: virtual varType get##funName(void) const { return varName; } \ 
public: virtual void set##funName(varType var) \ 
{ \ 
    if (varName != var) \ 
    { \ 
     CC_SAFE_RETAIN(var); \ 
     CC_SAFE_RELEASE(varName); \ 
     varName = var; \ 
    } \ 
} 

합니다. 제 생각에는 변수를 외부 사용에 노출시키고이 메소드를 자동으로 제공하려는 경우에만 실행 가능한 것으로 보입니다. 여기에 추가 된 값은 물론 retain - release 프로세스가 세터에서 수행 된 것입니다.

알려지지 않은 것이 있으면 알려주세요! 건배.

관련 문제