이 경우 std::vector
과 CCArray
사이의 주요 차이점은 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_back
및 pop_back
메서드가 각각 retain
및 realese
이되도록 그럴듯 할 수 있습니다. 매크로에 관해서는
- 내가 그것을 사용하지 않은,하지만이로 확장 : 세터와 외부 사용하기 위해 변수에 대한 게터를 생성
#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
프로세스가 세터에서 수행 된 것입니다.
알려지지 않은 것이 있으면 알려주세요! 건배.
위키를 읽었으며 많은 것을 알고 있습니다 : http://www.cocos2d-x.org/wiki/CCArray – einverne