cocos内存管理


C语言的内存管理:

申请内存 malloc,释放内存free

C++

申请内存 new 释放内存用delete

 

cocos2dx

申请内存用create之后就不管了,其原因是因为create函数调用了autorelease(当然本质上仍然是用new申请内存和delete释放,只是cocos通过机制自动化了上述操作)

 

1. autorelease是用于智能管理释放的

2. autorelease是定义的在Ref类中(Ref类就是专门做内存管理)

 

Ref类:(所有对象的根类,每个对象都继承自它)

Ref::_referenceCount 引用计数器,记录着该对象被引用的次数,如:

A对象,B对象使用到了A对象,那么就叫B引用了A

C对象也是用了A对象,那么就叫C引用了A

 

Ref::_referenceCount 初始化时为1,这个1表示自引用(在构造函数中)

 

Ref::retain接口(方法)负责将Ref::_referenceCount加1,表示有其他对象引用

Ref::release函数负责将Ref::_referenceCount减一,当为0时,delete掉当自己

所以release是释放内存的函数。其中有delete

 

Ref::autorelease是将对象自己放入到内存管理池(内存管理池本身就是一个栈,其中有好多

内存池,通过getCurrentPool获取栈顶池,池子本身实质上是一个存放Ref对象的vector,其操作就是将该对象放进对象vector)

 

放入管理池的意义在于:如果该对象在这个帧循环没有被别的对象引用的话,那么该对象在这个帧循环结束时被删除

其实就是这个帧没有用这个对象,则删除对象。

帧循环:就是最开始run()中的死循环函数,每一循环即一帧。Application::run()中的while()循环中的

director->mainLoop()中的PoolManager::getInstance()->getCurrentPool()->clear();完成每一帧的池处理

retain,release,autorelease这些函数一般来说不需要我们自己调用,需要了解哪些接口调用了这些函数

综上可知:addchild函数的子函数pushback调用了retain,所以添加子节点会增加对对象的引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值