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

Cocos2d-x, Create_func and init method, immediately call destructor

本文关键字:调用 析构函数 方法 init Create func Cocos2d-x      更新时间:2023-10-16

我习惯于使用Objective-C和Cocos2d,所以这里有一些让我困惑的地方

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

public:
SomeClass *matrix[6][6];

在.cpp的init方法中,我做了:

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中那样的保留/释放内容。

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

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

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

既然如此,我们还是来吧。

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

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

因此,如何纠正这些错误,有很多方法可以做到。最简单的方法是:this->matrix[0][0]=SomeClass::create((;this->matrix[0][0]->retain((;

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

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

有关更多信息,您可以阅读CC_SYNTHESIZE_RETAIN marco。

只需使用retain((。。

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

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