Cocos2d-x-3.x create()函数重载

来源:互联网 发布:淘宝首页图片大小 编辑:程序博客网 时间:2024/06/05 11:54

Cocos2d 在创建对象时需要调用create函数,该函数具体内容如下:

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

可以看到在create()函数中,先new了一个对象,然后判断了创建该对象和初始化(init())是否成功,两个都成功后,将对象调用autorelease()函数,也就是网上都在说的“自动释放池”。

create()函数中的自动释放功能非常的好用,可以省掉很多的麻烦,经过本人测试,如果不使用autorelease而自己delete的话,有时候会出现一些无法解释的bug(比如内存泄露(这个可以解释= =...),add/removeChild 无效, 对象内创建新对象错误/无效 等等)。但是,从函数中可以看到,create()和init()是绑在一起的,这就使得有时候操作起来很难受。如果单独再次调用init函数的话,就会使得init函数被调用了两次,产生许多更加无法解释的bug再见

解决办法有两个,1.把init()函数放空,继续使用create(),创建一个函数来替代init并单独调用  2.重载create()函数

两种办法我都试了再见,第一种很容易,这块主要记录第二种。在A.cpp中的代码如下:

A* A::create(int a){ A*pRet = new(std::nothrow)A();    if (pRet)     {        pRet->autorelease();         return pRet;     }     else     {         delete pRet;         pRet = nullptr;         return nullptr;     }}
其实就是把init()给去掉了= =。。。然后在参数里多加了一个没用的int来重载。当然,也可以使用这种方式向类内传参微笑


使用的时候这样用:

A* a = A::create(int a);a->init();


这样就可以既继续简单的使用autorelease()又达到了自己调用init()的目的。