温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Cocos2dx学习笔记(1) Ref类型数据 垃圾回收机制

发布时间:2020-06-11 11:54:41 来源:网络 阅读:1092 作者:葡萄甜醋 栏目:游戏开发

1、不调用autorelease()的情况

        TestVO* vo = new TestVO();
        //未调用create()方法创建,没有执行过autorelease()
        vo->init();
        //这种情况下局部变量无法被回收
        vo->release();
        //需要手动调用release()方法
        
        //CC_SAFE_DELETE(vo);
        //也可以用这种方法删除


2、调用autorelease()的情况

        TestVO* vo = TestVO::create(); //引用计数=1
        //create()方法中执行过autorelease()
        //引用计数设为1
        //在帧结束的时候引用计数-1
        //引用计数为0时被回收


3、手动调用retain()防止被删除

TestVO* vo = TestVO::create();//引用计数=1        
        vo->retain();//引用计数=2
        
        //......
        //帧结束 引用计数-1 值为1 不回收
        //......
        //下一帧开始时 引用计数+1 值为2
        //......
        
        //调用release()方法
        vo->release();//引用计数-1
        
        //......
        //帧结束 引用计数-1 值为0 被回收


4、被添加到cocos2d的数据结构时

        TestVO* vo = TestVO::create();//引用计数=1
        mList->pushBack(vo);//引用计数=2
        mList->popBack();//引用计数=1 能被回收
        
        Vector<TestVO*>* mList2 = new Vector<TestVO*>();
        mList2->pushBack(vo);//引用计数=2 无法被回收
        //如果mList2是局部变量,其他地方无法把vo从mList2中删除,vo将无法被回收


5、类的成员

    如果是继承Ref类型的数据,如果用create()创建,需要在创建后调用retain()函数,否则会在帧的结束被回收。

    如果是new的方法初始化的,不需要调用retain()

    删除该数据或赋其他的值时,都需要调用release()方法

    new 的方法创建的可以用CC_SAFE_DELETE(vo)这种方式删除。





向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI