C++ Cocos2d-x,创建_func和init方法,立即调用析构函数
我习惯于使用Objective-C和Cocos2d,所以这里有些东西让我感到困惑 我确实想将一些自定义对象保存到二维数组中,所以我在类的头中这样做,我想在其中保存数组: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-&
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;