cocos-js,内存管理1---引用计数方式

本文介绍了cocos2dx内存管理机制,特别是引用计数方式。通过c++代码示例,阐述了autorelease如何在帧末释放对象以及addChild和removeChild对引用计数的影响。同时讨论了不使用autorelease可能导致的内存泄漏问题,并提到了JS代码中的自动引用计数处理。
摘要由CSDN通过智能技术生成

一.开篇引题

在理解cocos2dx的内存管理机制之前,我们可以先了解下c++中变量的内存空间的分配问题.

我们在c++中写一个类,可以在栈上分配内存空间也可以使用new在堆上分配内存空间,如果类对象是在栈上分配的内存空间,这个内存空间的管理就不是我们的事了,但如果是在堆上分配的内存空间,当然需要我们来手动的delete了!

问题来了,cocos2dx如何管理内存:

cocos2dx采用的是在堆上分配内存空间,既然在堆上分配内存空间,那么如何管理这个内存空间,什么时候应该释放就是个问题了!在程序中,当我们创建了一个对象的时候,这块内存空间经常是被不同的对象引用,如果删除的早了,有对象还在引用这块内存空间那么程序必然要崩溃!所以cocos2dx引入了引用计数的内存管理机制


二.示例讲解

1.c++代码示例

//对象创建的时候引用计数被设置为1,这个是在它的构造函数中完成的,它会先调用父类Ref的构造函数
//Ref::Ref()
//: _referenceCount(1) 
Node * node = new Node();
("retain count:%d", node->getReferenceCount());

//调用retain方法的时候引用计数增加1
node->retain();
log("retain count:%d", node->getReferenceCount());

//调用release方法的时候引用计数减1,当这个引用计数减为0的时候,在release方法中会delete掉这个对象
node->release();
log("retain count:%d", node->getReferenceCount());

//当我们调用autorelease方法的时候会调用这段代码
//PoolManager::getInstance()->getCurrentPool()->addObject(this);
//调用autorelease方法的时候对象会被放到自动回收池中,这个自动回收池在每帧结束的时候会调用一次对象的release方法
node->autorelease();
log("
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值