2013-04-17 7 views
1

addChild() 전에 retain()을 호출해야하는 이유를 누구나 알 수 있습니까? addChild를 호출하면 풀이 관리됩니다. 우리가 추가 한 CCNode는 왜 우리가 그것을 유지하고 스스로 해결해야 하는가?Cocos2d-X 왜 addChild() 전에 add()를 호출해야합니까?

bool GameOverScene::init() 
{ 

    if(CCScene::init()) 
    { 
     this->_layer = GameOverLayer::create(); 
     this->_layer->retain(); 
     this->addChild(_layer); 

     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

GameOverScene::~GameOverScene() 
{ 

    if (_layer) 
    { 
     _layer->release(); 
     _layer = NULL; 
    } 
} 
+0

아마도 우리는 CCNode * 인 클래스 멤버 변수를 얻은 후에 응답을 유지해야할까요? – Sunderr

+0

실제로 유지 및 해제 호출을 제거하더라도 모두 제대로 작동해야합니다. 노드는 일부 상위 항목에 추가 된 후에 유지됩니다. 물론, 부모가 존재할 때까지. – Morion

+0

@Morion : 확실하지만 그것에 의존하기 쉽습니다. 인스턴스 변수를 일반적인 규칙으로 유지하는 것이 항상 쉽고, 특정 변수가 다른 것에 의해 유지 될 수 있는지 여부를 생각할 필요가 없습니다. – newacct

답변

2

저는 C++로 작성된 Cocos2D-X의 메모리 관리에 익숙하지 않습니다. 그러나 Cocoa에서 참조 계산 메모리 관리와 비슷하다면 인스턴스 변수를 설정할 때마다 이전 값을 해제하고 새 값을 유지해야합니다.

물론이 경우, 우리는 자신을 어린이로 추가함으로써 그 곳에서 유지된다는 것을 알게됩니다. 그러나 코드를 유지하기 위해 다른 것에 의존하여 코드를 허약하게 만듭니다. 따라서 인스턴스 변수를 작성할 때마다 다른 변수에 의해 유지 될 수 있는지 여부를 고려해야하며이 변수를 사용하는 모든 곳에서이 결정을 기억해야합니다. 항상 인스턴스 변수를 항상 일관되게 유지하는 것이 좋습니다. 그것은 더 이상 그것을 유지하는 것이 결코 아프지 않습니다.

+0

답장을 보내 주셔서 감사합니다! – Sunderr

+0

다른 질문을 찾을 수 있도록 도와 줄 수 있습니까? – Sunderr

0

당신의 답장을 보내 주셔서 감사합니다,하지만 난 또 다른 질문 만난 다음 replaceScene 후

void TextureCacheTestScene::runThisTest() 
{ 

    CCLayer* pLayer = new TextureCacheTest(); // not add the reference for pLayer 
    addChild(pLayer); // add 1 

    CCDirector::sharedDirector()->replaceScene(this); 
    pLayer->release(); // delete 1 
} 

우리가 릴리스 (호출 할 필요가 왜)()? 난 그냥 replaceScene 장면이 아닌 계층에 대한 참조를 추가 발견, 그래서 무슨 일이 있었는지와 혼동 느낌 :

  1. 하는 AddChild (플레이어) // 플레이어에 대한 참조를 추가;
  2. relplaceScene() // 장면에 대한 참조를 추가합니다 (pLayer에 대한 참조를 추가하지 않음).
  3. pLayer-> release() // pLayer에 대한 참조를 삭제합니다. 그렇다면 pLayer를 재활용 할 수없는 이유는 무엇입니까? 장면이 살아 있다면 pLayer를 재활용 할 수 없다고 생각합니다. 참조 계정이 걱정하지 않을 것이라고 생각합니다.
+0

이것은 귀하의 질문에 대한 답변이 아니므로 귀하의 질문과 관련이 없으므로 여기에 있어서는 안됩니다. 정말로 새로운 질문을 시작해야합니다. Cocos2d-X 메모리 관리가 Cocoa 메모리 관리와 같은 경우,'new TextureCacheTest()'는 Cocoa의'[[TextureCacheTest alloc] init]'처럼 보입니다. 즉, 자신이 소유 한 것을 반환합니다. 즉, 이미 한 번 보유 된 것입니다. 따라서 스코프 끝에있는 'release'와 균형을 맞추어야합니다. – newacct