C++ Cocos2d-x,创建_func和init方法,立即调用析构函数

C++ Cocos2d-x,创建_func和init方法,立即调用析构函数,c++,cocos2d-x,destructor,init,C++,Cocos2d X,Destructor,Init,我习惯于使用Objective-C和Cocos2d,所以这里有些东西让我感到困惑 我确实想将一些自定义对象保存到二维数组中,所以我在类的头中这样做,我想在其中保存数组: public: SomeClass *matrix[6][6]; 在init方法的.cpp中,我执行以下操作: this->matrix[0][0] = SomeClass::create(); 如果我这样做,构造函数、init和析构函数将按以下顺序调用。。。显然让我困惑的是析构函数调用 如果我这样做: this-&

我习惯于使用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的子类

构造函数被调用,这很好。。。但是,既然我确实想在create中使用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; \
      } \
}

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

由于cocos2d-x与cocos2d相关,cocos2d-x团队愿意使用object-c中的保留/发布内容

显然,只有当cObject的retain值大于0时,它才会被保存在内存中

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

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

那么让我们来看看这个例子

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

这就是为什么当您使用->矩阵[0][0]=SomeClass::create()时;构造函数、init和析构函数将逐个调用,但请记住,析构函数将在下一帧中调用,而不是在init()之后立即调用

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

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

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


有关更多信息,请阅读CC_synthesis_RETAIN marco。

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

由于cocos2d-x与cocos2d相关,cocos2d-x团队愿意使用object-c中的保留/发布内容

显然,只有当cObject的retain值大于0时,它才会被保存在内存中

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

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

那么让我们来看看这个例子

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

这就是为什么当您使用->矩阵[0][0]=SomeClass::create()时;构造函数、init和析构函数将逐个调用,但请记住,析构函数将在下一帧中调用,而不是在init()之后立即调用

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

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

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


有关更多信息,请阅读CC_synthesis_RETAIN marco。

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

由于cocos2d-x与cocos2d相关,cocos2d-x团队愿意使用object-c中的保留/发布内容

显然,只有当cObject的retain值大于0时,它才会被保存在内存中

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

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

那么让我们来看看这个例子

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

这就是为什么当您使用->矩阵[0][0]=SomeClass::create()时;构造函数、init和析构函数将逐个调用,但请记住,析构函数将在下一帧中调用,而不是在init()之后立即调用

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

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

并使用set##funName(varType var)来设置它,而不是使用valueName=ClassNam
SomeClass *newObject=SomeClass::create();
newObject->retain();
this->matrix[0][0] = newObject;