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,所以添加子节点会增加对对象的引用