Cocos2d-x,Create_func和init方法,立即调用析构函数

时间:2013-11-06 08:40:17

标签: c++ cocos2d-x destructor init

我习惯使用Objective-C和Cocos2d,所以这里让我感到困惑。

我确实想将一些自定义对象保存到一个二维数组中,所以我这样做,在我想要数组的类的标题中:

public:

SomeClass *matrix[6][6];

并在init方法的.cpp中执行:

this->matrix[0][0] = SomeClass::create();

如果我这样做,构造函数,init和析构函数按此顺序调用...显然,令我困惑的是析构函数调用。

如果我这样做:

this->matrix[0][0] = new SomeClass;

SomeClass是CCNode的子类。

构造函数被调用,这很好......但是因为我确实想在创建时使用init方法,我该怎么办?我不知道为什么使用create方法,它会在方法返回时立即调用析构函数。

我真的不明白init方法和Create_func是怎么回事,因为我是Cocos2d-x的新手,这是我想要更好理解的东西。

这是我正在使用的创建函数:

#define CREATE_FUNC(__TYPE__) \
static __TYPE__* create() \
{ \
    __TYPE__ *pRet = new __TYPE__(); \
    if (pRet && pRet->init()) \
    { \
       pRet->autorelease(); \
       return pRet; \
     } \
     else \
     { \
        delete pRet; \
        pRet = NULL; \
        return NULL; \
      } \
}

2 个答案:

答案 0 :(得分:2)

首先,让我解释一下cocos2d-x内存管理是如何工作的。

由于cocos2d-x与cocos2d有关,所以cocos2d-x团队愿意使用像object-c这样的保留/释放内容。

显然,只有当CCObject的保留值大于0时,CCObject才会被保留在内存中。

调用函数release();后,此对象的保留值将减1,如果它达到0,则将调用析构函数。

最后,autorelase()函数。它是什么,对于cocos2d-x,核心线程在CCPoolManager :: sharedPoolManager()中保存CCArray。在每个帧中,此数组中的所有对象都将调用release()一次,如果保留值== 0将被删除。

所以,让我们来看看。

我相信autorelease()是让你困惑的原因。 当一个对象由新的ClassName()创建时,retain == 1; 但如果它被称为autorelease(),它仍然保持为1,但在下一帧中将为0。

这就是为什么当你使用this-> matrix [0] [0] = SomeClass :: create();构造函数,init和析构函数将逐个调用,但请记住,析构函数是在init()之后的下一帧中调用的。

那么如何使这些正确,有很多方法可以做到这一点。 最简单的方法是: this-> matrix [0] [0] = SomeClass :: create(); 这 - >矩阵[0] [0] - >保留();

除此之外,我强烈建议使用CC_SYNTHESIZE_RETAIN(varType,varName,funName)在headder文件中定义一个值而不是ClassName * valueName。

并使用set ## funName(varType var)来设置它而不是使用valueName = ClassName :: create()。

如需了解更多信息,请阅读CC_SYNTHESIZE_RETAIN marco。

答案 1 :(得分:1)

只需使用retain()..

SomeClass *newObject=SomeClass::create();
newObject->retain();
this->matrix[0][0] = newObject;

然后你需要在删除此数组之前手动释放对象,否则可能会发生内存泄漏。