当前位置: 首页 > news >正文

Cocos2d-x3.0模版容器详解之三:cocos2d::Value

为什么80%的码农都做不了架构师?>>>   hot3.png

1.概述

  • 版本: v3.0 beta

  • 语言: C++


定义在 “COCOS2DX_ROOT/cocos/base” 路径下的 "CCValue.h" 的头文件中。

class Value;

unioncocos2d::Valie 是一个包含了很多原生类型(int,float,double,bool,unsigned char,char* 和 std::string)外加 std::vector<Value>, std::unordered_map<std::string,Value> 和 std::unordered_map<int,Value> 的类。

你可以把所有上面的提及的原生类型放入 cocos2d::Value 对象中,然后将它们转化为对应的原生类型,反之亦然。
在内部,cocos2d::Value 使用了一个联合变量来保存各种原生类型,这样可以节省很多的内存空间。
在 Cocos2d-x v3.0 beta 之前,存在着一些原生类型的封装类,如 CCBool, CCFloat, CCDouble, CCinteger,这些将会被弃用。
注意:当你在处理原生类型和容器的时候,请使用 cocos2d::Vector<T>,cocos2d::Map<K,V> 和 cocos2d::Value。

2.内存管理

cocos2d::Value 的内存是由它自己的析构函数自动处理的。所以当处理 cocos2d::Value 的内存时请坚持以 c++ 内存管理规则进行最佳实践。
cocos2d::Value 类包含了以下的数据成员:

{
     unsigned char byteVal;
     int intVal;
     float floatVal;
     double doubleVal;
     bool boolVal;
}_baseData;
  
std::string _strData;
ValueVector* _vectorData;
ValueMap* _mapData;
ValueMapIntKey* _intKeyMapData;
  
Type _type;


从代码片段可以看到,_baseData,_strData 和 _type 数据成员的内存是由编译器和她们的析构函数自动处理的。cocos2d::Value 的析构函数负责释放所有指针成员变量的资源(_vectorData,_mapData 和 _intKeyMapData)。
警告: cocos2d::Value 不再像其他的 cocos2d 类一样使用 retain/release和引用计数内存管理。

3.基本用法

cocos2d::Value 的用法是非常简单的。
这里提供一个简单的示例:

Value val;               // 调用默认构造函数
if(val.isNull()) 
{
   log("val is null");
}
else{
   std::string str =val.getDescription();
   log("The description of val0:%s",str.c_str());
}
//----------------------------------------------------
Value val1(65);               // 用一个 int 初始化
//Value val1(3.4f);   // 用一个 float 初始化
//Value val1(3.5);   // 用一个 double 初始化
log("The description of the integer value:%s" ,val1.getDescription().c_str());
log("val1.asByte() = %c" ,val1.asByte());
//----------------------------------------------------
std::string strV = "string";
Value val2(strV);               // 用 string 初始化
log("The description of the string value:%s" ,val2.getDescription().c_str());
//----------------------------------------------------
auto sp0 = Sprite::create();
Vector<Object*>* vecV = new Vector<Object*>();
vecV->pushBack(sp0);
Value val3(vecV);               // 用 Vector 初始化
log("The description of the Vector value:%s" ,val3.getDescription().c_str());
delete vecV;
//----------------------------------------------------
Map<std::string, Object*>* mapV = new Map<std::string, Object*>();
mapV->insert(strV,sp0);
Value val4(mapV);               // 用 Map 初始化
log("The description of the Map value:%s" ,val4.getDescription().c_str());
delete mapV;
//----------------------------------------------------
Value val6(&val4);               // 用 Map 初始化
log("The description of the Value-type value:%s" ,val6.getDescription().c_str());
//----------------------------------------------------
val2 = val1;               // 在两个不同指类型间赋值
log("operator-> The description of val2:%s" ,val2.getDescription().c_str());
val2 = 4;               // 直接赋值
log("operator-> The description of val4:%s" ,val2.getDescription().c_str());

输出:

cocos2d: val is null
cocos2d: The description of the integer value:
65
  
cocos2d: val1.asByte() = A
cocos2d: The description of the string value:
string
  
cocos2d: The description of the Vector value:
true
  
cocos2d: The description of the Map value:
true
  
cocos2d: The description of the Value-type value:
true
  
cocos2d:             operator             -> The description of val2:
65
  
cocos2d:             operator             -> The description of val4:
4


4.最佳实践

  • 偏向于使用 cocos2d::Value 和新模版容器(cocos2d::Vector<T> 和 cocos2d::Map<K,V>)而不是使用 cocos2d::CCBool,cocos2d::CCFloat,cocos2d::CCDouble,cocos2d::CCString,cocos2d::CCInteger 和旧 Objective-c 风格容器(cocos2d::CCArray 和 cocos2d::CCDictionary)。
    当你想要处理原生类型集合的时候,用 cocos2d::Value 封装原生类型,然后用新的模版容器 cocos2d::Vector<T> 和 cocos2d::Map<K,V> 组合它们。


转载于:https://my.oschina.net/Jacedy/blog/301367

相关文章:

  • dsoframer.ocx 实现在线的word编辑
  • 百度地图3.1.0(二)基于MapFragment的基本地图
  • XAMPP PHPSTORM XDEBUG 配合使用
  • java中有关线程的题目
  • linux中的僵尸进程
  • 图练习-BFS-从起点到目标点的最短步数(sdut 2830)邻接边表
  • Skill Level 4 D23
  • 《程序员的数学》读后感
  • 2014年8月21日   第一天学习linux linux的下载地址
  • android api doc 一
  • Oracle中的copy from导数
  • Hadoop:Task process exit with nonzero status of 1 异常
  • HTML的认识
  • 【HDOJ】4983 Goffi and GCD
  • StarkSoft题库管理系统(二)--生成word格式试卷
  • javascript 哈希表
  • leetcode388. Longest Absolute File Path
  • linux学习笔记
  • Mybatis初体验
  • nodejs实现webservice问题总结
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Python学习之路16-使用API
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • SQLServer之创建显式事务
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vue的全局变量和全局拦截请求器
  • 当SetTimeout遇到了字符串
  • 计算机常识 - 收藏集 - 掘金
  • 技术胖1-4季视频复习— (看视频笔记)
  • 力扣(LeetCode)21
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 整理一些计算机基础知识!
  • (补)B+树一些思想
  • (转载)深入super,看Python如何解决钻石继承难题
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .mysql secret在哪_MYSQL基本操作(上)
  • .Net Redis的秒杀Dome和异步执行
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .netcore如何运行环境安装到Linux服务器
  • .NET中的Exception处理(C#)
  • @Bean, @Component, @Configuration简析
  • @synthesize和@dynamic分别有什么作用?
  • @TableLogic注解说明,以及对增删改查的影响
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [2]十道算法题【Java实现】
  • [20171106]配置客户端连接注意.txt
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [BT]BUUCTF刷题第4天(3.22)
  • [C#基础知识系列]专题十七:深入理解动态类型
  • [C/C++] -- 二叉树
  • [C/C++]数据结构 循环队列
  • [cocos creator]EditBox,editing-return事件,清空输入框