课程表

入门与环境搭建

简单控件的使用

视图控制

调用、存储、网络和动画

其他控件的使用

工具箱
速查手册

CrossApp内存管理

当前位置:免费教程 » 移动开发 » CrossApp

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的原则。

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号