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

1.概述

c++

  • 版本: v3.0 betagit

  • 語言: C++github


定義在 「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> 的類。spa

你能夠把全部上面的說起的原生類型放入 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 的用法是很是簡單的。
這裏提供一個簡單的示例:
code

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.最佳實踐
ip

  • 偏向於使用 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> 組合它們。內存

相關文章
相關標籤/搜索