【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第十三课:Cocos2
【麦可网】Cocos2d-X跨平台游戏开发---学习笔记
第十三课:Cocos2D-X内存管理4-6 =======================================================================================================================================================================
课程目标: -Cocos2D-X内存管理机制 课程重点: -CC++内存管理机制 -引用计数内存管理机制 -自动释放机制 考核目标 -理解引用计数内存管理机制 -合理运用自动释放机制
======================================================================================================================================================================= 一、自动释放池CCPoolManager sprite->autorelease(); 例: CCSprite* pSprite = CCSprite::spriteWithFile("HelloWorld.png");<span style="white-space:pre"> </span>//自动释放池 this->addChild(pSprite,0); 其中: CCSprite* CCSprite::spriteWithFile(const char *pszFileName) { CCSprite *pobSprite = new CCSprite(); if (pobSprite && pobSprite->initWithFile(pszFileName)) { pobSprite->autorelease(); //自动释放机制 return pobSprite; } CC_SAFE_DELETE(pobSprite); return NULL; } 二、静态工厂方法static CCSprite *spriteWithTexture(CCTexture2D *pTexture); static CCSprite *spriteWithTexture(CCTexture2D *pTexture,const CCRect &rect); static CCSprite *spriteWithTexture(CCTexture2D *pTexture,const CCRect &rect,const CCPoint &offset); static CCSprite *spriteWithSpriteFrame(CCSpriteframe *pSpriteFrame); static CCSprite *spriteWithSpriteFrame(const char *pszSpriteFrameName); static CCSprite *spriteWithFile(const char *pszFileName); static CCSprite *spriteWithFile(const char *pszFileName,const CCRect &rect); static CCsprite *spriteWithBatchNode(CCSpriteBatchNode *batchNode,const CCRect &rect); ------------------------------------------------ Cocos2D-X里new和release配对才能发挥引用计数的功能。 CCSprite *sprite = new CCSprite(); sprite->release(); 以init开头的都没有自动释放,如:initWithcolorWidthHeight 以名称(如layersprite)开头的都有自动释放,如:layerwithcolor 三、Cocos2D-X里用宏实现私有成员get和set用宏来对私有成员实现get和set,以减少工作量 使用前需包含:头文件“cocos2d.h”和命名空间USING_NS_CC; #define CC_SYNTHESIZE(varType,varName,funName) protected: varType varName; public: virtual varType get##funName(void) const { return varName; } public: virtual void set##funName(varType var){ varName = var; } --------------------------------------------------- 指针型私有成员的set CC_SYNTHESIZE_RETAIN(CCSprite*,_Sprite,Sprite); #define CC_SYNTHESIZE_RETAIN(varType,funName) protected: varType varName; public: virtual varType get##funName(void) const { return varName; } public: virtual void set##funName(varType var) { CC_SAFE_RETAIN(var); //引用计数加1 CC_SAFE_RELEASE(varName); <span style="white-space:pre"> </span>//防止内存泄漏,需先delete之前的 varName = var; } -------------------------------------------------------- 安全释放的宏: #define CC_SAFE_DELETE(p) if(p) { delete (p); (p) = 0; } #define CC_SAFE_DELETE_ARRAY(p) <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>if(p) { delete[] (p); (p) = 0; } #define CC_SAFE_FREE(p) <span style="white-space:pre"> </span>if(p) { free(p); (p) = 0; } #define CC_SAFE_RELEASE(p) <span style="white-space:pre"> </span>if(p) { (p)->release(); } #define CC_SAFE_RELEASE_NULL(p) <span style="white-space:pre"> </span>if(p) { (p)->release(); (p) = 0; } #define CC_SAFE_RETAIN(p) if(p) { (p)->retain(); } #define CC_BREAK_IF(cond) if(cond) break; =================================================================== 总结: 先从掌握静态工厂和安全释放宏开始,多用宏,安全又方便。 开心一刻: 四只老鼠吹牛: 甲:我每天都拿鼠药当糖吃; 乙:我一天不踩老鼠夹脚发痒; 丙:我每天不过几次大街不踏实; 丁:时间不早了,回家抱猫去咯。 【麦可网】Cocos2d-X跨平台游戏开发---教程下载:http://pan.baidu.com/s/1kTio1Av 【麦可网】Cocos2d-X跨平台游戏开发---笔记系列:http://blog.csdn.net/qiulanzhu (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – Rails 4 – Mailer deliver_la
- SQLite3数据库Native C++封装类(Unicode)CppSQ
- iphone – 自动增量版本号xcode?
- 彻底理解Flexbox
- objective-c – 请求与NSURLRequest
- Need to add a category for addStratosphereSsp
- No grammar constraints (DTD or XML schema) de
- Swift - 在ViewController中表格使用静态单元格(
- oracle中delete drop truncate的用法和区别
- 在C中生成AST