请选择 进入手机版 | 继续访问电脑版
查看: 3521|回复: 6

[教程] [无脑码农CrossApp笔记]--CrossApp内存管理

[复制链接]
最佳答案
0 
无脑码农 发表于 2015-5-7 10:27:23 | 显示全部楼层 |阅读模式
本帖最后由 无脑码农 于 2015-5-7 10:36 编辑

本课程在线播放地址:http://edu.9miao.com/course/1
CrossApp是用一种引用计数的方式来管理内存对象,通过CAObject、CAAutoreleasePool、CAPoolManager来完成内存的管理。

CAObject为引用计数类,在其构造函数的时候,CAObject的引用计数为1,但此时并未加入到自动释放池里,所有自动引用计数为0
在使用create创建对象时候,会调用autorelease,将对象放到对象池,CAAutoreleasePool的队列中接受管理。CAObject调用retain()则引用计数会增加1,调用release()引用计数会减少1.

CAAutoreleasePool是引擎初始化时创建了一个默认的自动释放对象列表,并把它加入到CAPoolManager里进行管理。

引擎每次主循环都会有一次CAPoolManager中pool的清理,那些引用计数为0的CAObject都会被释放掉。这就是CrossApp的内存管理机制。



CAObject
  1. //属性:
  2. //引用数量
  3. unsigned int m_uReference;
  4. //自动引用数量
  5. unsigned int m_uAutoReleaseCount;
复制代码
  1. //方法:
  2. //引用计数+1
  3. retain();
  4. //引用计数-1
  5. relesase();
  6. //添加到自动释放管理
  7. autorelease();
  8. //返回当前的引用计数
  9. retainCount();
复制代码
同时引擎为了方便内存管理,用一些关于内存管理的函数和宏定义。


常见的函数比如:
create();//内包含autorelease()调用
insertSubview();//内包含retain()调用
removeSubview();//内好汉relesase()调用

常见的宏
#define CC_SAFE_DELETE(p)           do { if(p) { delete (p); (p) = 0; } } while(0)
#define CC_SAFE_DELETE_ARRAY(p)     do { if(p) { delete[] (p); (p) = 0; } } while(0)
#define CC_SAFE_FREE(p)             do { if(p) { free(p); (p) = 0; } } while(0)
#define CC_SAFE_RELEASE(p)          do { if(p) { (p)->release(); } } while(0)
#define CC_SAFE_RELEASE_NULL(p)     do { if(p) { (p)->release(); (p) = 0; } } while(0)
#define CC_SAFE_RETAIN(p)           do { if(p) { (p)->retain(); } } while(0)




还有专门用于适应CrossApp的数据容器:  CAVector、CAList、CADeque、CAMap 其使用方法类似于c++的vector、list、deque、map的用法,其根本不同在于其添加和移除时,遵循CrossApp的内存管理原则。


假如我们有需求,需要我们自己手动管理一个对象指针的内存,那么我们需要,retain()和relesase()在一个类中成对出现,遵循谁负责retain谁就负责relesase的原则。
最佳答案
0 
App 发表于 2015-5-7 11:46:27 | 显示全部楼层
好东西来顶顶
最佳答案
0 
抱大鸡蛋大腿 发表于 2015-5-7 21:56:04 | 显示全部楼层
师兄  有错别字哦
最佳答案
0 
你喜文化 发表于 2015-7-27 11:13:29 | 显示全部楼层
当object->delete以后 ,还可以调用object->retainCount()吗?

请问老师,原理是什么?

点评

你问的问题有点模糊,请贴出代码我看看~  详情 回复 发表于 2015-7-27 18:48
最佳答案
0 
 楼主| 无脑码农 发表于 2015-7-27 18:48:08 | 显示全部楼层
你喜文化 发表于 2015-7-27 11:13
当object->delete以后 ,还可以调用object->retainCount()吗?

请问老师,原理是什么? ...

你问的问题有点模糊,请贴出代码我看看~

点评

[attachimg]49498[/attachimg] 是想问老师,一个对象release后,还可以获取到对象并获取其引用计数器吗? 谢谢!  详情 回复 发表于 2015-8-7 20:16
最佳答案
0 
你喜文化 发表于 2015-8-7 20:16:36 | 显示全部楼层
无脑码农 发表于 2015-7-27 18:48
你问的问题有点模糊,请贴出代码我看看~

QQ图片20150807201831.png

是想问老师,一个对象release后,还可以获取到对象并获取其引用计数器吗?

谢谢!
最佳答案
0 
goldenrtiger 发表于 2015-11-15 21:48:59 | 显示全部楼层
请教两个问题:
图1所示:当retainCount() = 0的时候,CCLog中输出的不是0,这是为什么?
图2所示:加入了autorelease,只有当引用系数为0时,才释放类。但是当release减引用系数到1的时候,好像这个类就被自动释放掉了。这是为什么?

图1

图1

图2

图2
您需要登录后才可以回帖 登录 | 注册

本版积分规则

推荐阅读 More>

© 2001-2015 9秒社团

合作伙伴

公司简介 | 联系方式
COPYRIGHT©2015 ZHONGQINGLONGTU NETWORK CO.LTD ALL RIGHTS RESERVED.ICP备11023195号-4
北京中清龙图网络技术有限公司
返回顶部 返回列表