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()的目的。
阅读全文
0 0
- Cocos2d-x-3.x create()函数重载
- Create Cocos2D-X HelloWorld Project
- cocos2d-x 两阶段构造器以及静态create()函数
- cocos2d x 3.x
- cocos2d-x draw 函数
- cocos2d-x 随机函数
- cocos2d-x 函数
- Cocos2d-x函数----addChild()
- Cocos2d-x函数----addChild()
- Cocos2d-x函数----addChild()
- cocos2d-x函数使用
- Cocos2d-x函数----addChild
- Cocos2d-x函数----addChild()
- Cocos2d-x函数----addChild()
- cocos2d-x 3.x学习之Vector常用函数
- Cocos2d-x 3.x部署
- cocos2d-x-3.x guides
- cocos2d-x 3.x CallFunc
- UE
- wifi
- 7144
- 欢迎使用CSDN-markdown编辑器
- 【寒江雪】动态规划小结
- Cocos2d-x-3.x create()函数重载
- Cocos2d-x-3.x 向Layer或Scene传参
- win10无法安装TortoiseSVN的解决方案
- Struts2_国际化-Action范围资源文件、jsp中直接访问某个资源文件
- 解读今年的 Google IO 2017
- 《java多线程编程技术核心》读书笔记11
- 第21课:Spark性能调优之系统资源使用原理和调优最佳实践
- 保持学习的态度
- 理论---mongoDB的常用操作