首页 > 代码库 > 【cocos2d-x 学习笔记 02】对象创建方式比较

【cocos2d-x 学习笔记 02】对象创建方式比较

1. 创建对象实例的方式比较

cocos2d-x中获取对象实例的方式与一般的C++编程方式有些不同,下面就是一段代码,比较了对象的创建、初始化和销毁过程二者不同的编写方式:

一般C++对象创建代码:
Object *obj = new Object(arg1, arg2);
delete obj;
一般C++对象在其构造函数中完成初始化操作,同时new出来的对象需要自己负责释放。

cocos2d-x中对象创建代码:
Object *obj = Object::create();
cocos2d-x中通过调用类的静态函数create()返回对象的指针,new出的对象由cocos2d-x自己的内存管理机制负责释放,因此不用担心内存释放问题。create()函数一般有三个操作:
1)创建对象,构造函数中不包含复杂逻辑,仅仅只负责初始化成员变量。
2)调用对象的初始化函数,如init()、initWithXX()等,返回bool值标识初始化是否成功。
3)调用对象继承自基类Ref的函数autorelease(),交由cocos2d-x负责内存的释放。
Object *Object::create()
{
    Object *obj = new Object;
    if (obj && obj->init())
    {
         obj->autorelease();
    }
    else
    {
         delete obj;
         obj = nullptr;
    }
    return obj;
}
cocos2d-x 中提供了宏CREATE_FUNC(__TYPE__)来完成上面的create()函数定义,不过它只能创建无参数的create()函数,如果需要在create()函数中传入参数还是的自己写。

2. 优缺点

一般C++创建对象的方式,直观符合一般的C++编程习惯,缺点是需要自己负责资源的释放(这一点可以使用共享指针std::shared_ptr来最大限度避免出错)。

cocos2d-x创建对象的方式,其在构造函数中初始化成员变量,在初始化函数中完成对象的初始化工作,在类的静态函数create()中完成前两步并将内存交由其内部的内存管理机制管理。可能有点绕弯,但是一旦习惯用起来还是很好的。这种方式最大的优点在于不用担心new出的对象的释放问题,所以比较适用于类继承自Ref的情况,这样可以获得cocos2d-x所带来的内存自动管理的好处。

3. 总结

     在编写自己的类时,如果类功能较多考虑继承自类 Ref,以获得内存自动管理,并使用cocos2d-x的对象创建风格。如果类的功能很单一,例如Vec2、Size这样的类,考虑使用一般的C++风格来创建对象实例。

【cocos2d-x 学习笔记 02】对象创建方式比较