1. #ifndef __CCDICTIONARY_H__
  2. #define __CCDICTIONARY_H__
  3. //需要哈希表的支持
  4. #include "support/data_support/uthash.h"
  5. #include "CCObject.h"
  6. #include "CCArray.h"
  7. #include "CCString.h"
  8. //Cocos2d命名空间
  9. NS_CC_BEGIN
  10. //声明一下CCDictionary类,因为CCDictElement要用到CCDictionary指针。
  11. class CCDictionary;
  12.  
  13. //词典元素,或者简单理解就是词典中的一个词汇。我们从小查词典都知道,通过词汇名称或索引查找到对应的解释。解释与词汇名称或索引之间是一一对应的关系。与这种关系相同,在这个词汇类中存储一个字符串名称或一个索引以及与其相应的CCObject指针,这个CCObject指针就相当于是我们查出来的解释一样与字符串名称或索引构成了对应关系。
  14.  
  15. class CC_DLL CCDictElement
  16. {
  17. //定义字符串名称的长度.
  18. #define MAX_KEY_LEN 256
  19. public:
  20. //构造函数。
  21. //参1:字符串名称。
  22. //参2:对应的CCObject指针。
  23. CCDictElement(const char* pszKey, CCObject* pObject)
  24. {
  25. //初始化。
  26. init();
  27. m_pObject = pObject;
  28. //
  29. const char* pStart = pszKey;
  30. //字符串的字节长度
  31. int len = strlen(pszKey);
  32. if (len > MAX_KEY_LEN )
  33. { //如果长度大于MAX_KEY_LEN,截取后面MAX_KEY_LEN长度字符串。
  34. char* pEnd = (char*)&pszKey[len-];
  35. pStart = pEnd - (MAX_KEY_LEN-);
  36. }
  37. //字符串COPY
  38. strcpy(m_szKey, pStart);
  39. }
  40. //构造函数
  41. //参1:所在哈希表中的索引
  42. //参2:对应的CCObject指针。
  43. CCDictElement(int iKey, CCObject* pObject)
  44. {
  45. init();
  46. m_iKey = iKey;
  47. m_pObject = pObject;
  48. }
  49. //取得名称字符串。
  50. inline const char* getStrKey() const
  51. {
  52. CCAssert(m_szKey[] != '\0', "Should not call this function for integer dictionary");
  53. return m_szKey;
  54. }
  55. //取得哈希索引。
  56. inline int getIntKey() const
  57. {
  58. CCAssert(m_szKey[] == '\0', "Should not call this function for string dictionary");
  59. return m_iKey;
  60. }
  61. //取得CCObject指针。
  62. inline CCObject* getObject() const
  63. {
  64. return m_pObject;
  65. }
  66.  
  67. private:
  68. //初始化。
  69. inline void init()
  70. {
  71. m_iKey = ;
  72. m_pObject = NULL;
  73. memset(m_szKey, , sizeof(m_szKey));
  74. memset(&hh, , sizeof(hh));
  75. }
  76.  
  77. private:
  78. char m_szKey[MAX_KEY_LEN+]; //存储名称的字符数组。
  79. int m_iKey; //哈希表索引
  80. CCObject* m_pObject; //哈希值(CCObject指针)
  81. public:
  82. UT_hash_handle hh; //哈希表结构指针
  83. friend class CCDictionary; //词典为友元类
  84. };
  85.  
  86. //遍历词典中的所有词汇的一个宏,它内部调用HASH_ITER来进行for循环遍历链表。
  87. #define CCDICT_FOREACH(__dict__, __el__) \
  88. CCDictElement* pTmp##__dict__##__el__ = NULL; \
  89. HASH_ITER(hh, (__dict__)->m_pElements, __el__, pTmp##__dict__##__el__)
  90.  
  91. //词典类,由CCObject派生
  92. class CC_DLL CCDictionary : public CCObject
  93. {
  94. public:
  95. //构造函数
  96. CCDictionary();
  97. //析构函数
  98. ~CCDictionary();
  99.  
  100. //取得所有词汇的数量。
  101. unsigned int count();
  102.  
  103. //返回所有的查询关键字。
  104. CCArray* allKeys();
  105.  
  106. //取得对应CCObject指针的所有关键字或索引值。
  107. CCArray* allKeysForObject(CCObject* object);
  108. //通过查询关键字取得对应CCObject指针
  109. CCObject* objectForKey(const std::string& key);
  110. //通过哈希索引值取得对应CCObject指针
  111. CCObject* objectForKey(int key);
  112. //通过查询关键字取得对应CCString指针
  113. const CCString* valueForKey(const std::string& key);
  114. //通过哈希索引值取得对应CCString指针
  115. const CCString* valueForKey(int key);
  116. //设置一个CCObject和对应的名称存入词典。
  117. void setObject(CCObject* pObject, const std::string& key);
  118. //设置一个CCObject和对应的哈希索引存入词典。
  119. void setObject(CCObject* pObject, int key);
  120. //按照查询关键字找到对应CCObject并删除。
  121. void removeObjectForKey(const std::string& key);
  122. //按照哈希索引找到对应CCObject并删除。
  123. void removeObjectForKey(int key);
  124. //按照容器中的查询关键字找到对应CCObject并删除。
  125. void removeObjectsForKeys(CCArray* pKeyArray);
  126. //从词典中删除相应的词汇。
  127. void removeObjectForElememt(CCDictElement* pElement);
  128. //从词典中清空所有的词汇。
  129. void removeAllObjects();
  130. //重载CCObject的拷贝函数。产生一个一模一样的词典。
  131. virtual CCObject* copyWithZone(CCZone* pZone);
  132.  
  133. //静态函数,取得单例的词典。请改用create函数,因为这个函数以后将被删除掉。
  134. CC_DEPRECATED_ATTRIBUTE static CCDictionary* dictionary();
  135.  
  136. //静态函数,取得一个指定词典的COPY,请改用createWithDictionary函数,因为这个函数以后将被删除掉。
  137. CC_DEPRECATED_ATTRIBUTE static CCDictionary* dictionaryWithDictionary(CCDictionary* srcDict);
  138.  
  139. //静态函数:从一个plist文件中加载词典内容。此函数创建的词典是交由内存管理器来进行资源计数的,不需手动release。但请改用createWithContentsOfFile函数,因为这个函数以后也将被删除掉。
  140. CC_DEPRECATED_ATTRIBUTE static CCDictionary* dictionaryWithContentsOfFile(const char *pFileName);
  141.  
  142. //静态函数:从一个plist文件中加载词典内容,但此函数是多线程安全的,另外此函数创建的词典需要手动release。请改用 createWithContentsOfFileThreadSafe函数,因为这个函数以后也将被删除掉。
  143. CC_DEPRECATED_ATTRIBUTE static CCDictionary* dictionaryWithContentsOfFileThreadSafe(const char *pFileName);
  144. //静态函数,创建一个新词典
  145. static CCDictionary* create();
  146. //静态函数,取得一个指定词典的COPY。
  147. static CCDictionary* createWithDictionary(CCDictionary* srcDict);
  148.  
  149. //静态函数:从一个plist文件中加载词典内容。
  150. static CCDictionary* createWithContentsOfFile(const char *pFileName);
  151. //静态函数:从一个plist文件中加载词典内容,但此函数是多线程安全的,另外此函数创建的词典需要手动release。
  152. static CCDictionary* createWithContentsOfFileThreadSafe(const char *pFileName);
  153.  
  154. private:
  155. //将CCObject实例指针与对应的字符串名称存入哈希表。
  156. void setObjectUnSafe(CCObject* pObject, const std::string& key);
  157. //将CCObject实例指针与对应的索引值存入哈希表。
  158. void setObjectUnSafe(CCObject* pObject, const int key);
  159.  
  160. public:
  161. //词汇的哈希表头部结构指针。
  162. CCDictElement* m_pElements;
  163. private:
  164. //词典查询类型。
  165. enum CCDictType
  166. {
  167. kCCDictUnknown = ,
  168. kCCDictStr,//字符串名称
  169. kCCDictInt //索引
  170. };
  171. CCDictType m_eDictType; //当前词典查询类型。一个词典实例要求只有一种固定词典查询类型。
  172. CCDictType m_eOldDictType; //上次词典查询类型。这个变量是用来比对是否改变了词典查询类型。
  173. };
  174. NS_CC_END
  1. #include "CCDictionary.h"
  2. #include "CCString.h"
  3. #include "CCInteger.h"
  4. using namespace std;
  5. //使用Cocos2d命名空间
  6. NS_CC_BEGIN
  7. //构造函数
  8. CCDictionary::CCDictionary()
  9. : m_pElements(NULL)
  10. , m_eDictType(kCCDictUnknown)
  11. , m_eOldDictType(kCCDictUnknown)
  12. {
  13.  
  14. }
  15. //析构函数。
  16. CCDictionary::~CCDictionary()
  17. {
  18. //请空词汇,释放所有词汇占用的内存。
  19. removeAllObjects();
  20. }
  21. //取得词典中的所有词汇数量。
  22. unsigned int CCDictionary::count()
  23. {
  24. //通过HASH_CONT宏来取得哈希表的元素数量。
  25. return HASH_COUNT(m_pElements);
  26. }
  27. //返回所有的查询关键字。
  28. CCArray* CCDictionary::allKeys()
  29. {
  30. //取得词汇的数量
  31. int iKeyCount = this->count();
  32. if (iKeyCount <= ) return NULL;
  33. //创建一个iKeyCount大小的CCArray
  34. CCArray* pArray = CCArray::createWithCapacity(iKeyCount);
  35. //定义临时词汇指针变量。
  36. CCDictElement *pElement, *tmp;
  37. if (m_eDictType == kCCDictStr)
  38. { //如果当前词典查询类型是通过名称字符串。
  39. //遍历所有词汇。
  40. HASH_ITER(hh, m_pElements, pElement, tmp)
  41. {
  42. //取得每一个词汇的名称字符串放入CCArray中。
  43. CCString* pOneKey = new CCString(pElement->m_szKey);
  44. pOneKey->autorelease();
  45. pArray->addObject(pOneKey);
  46. }
  47. }
  48. else if (m_eDictType == kCCDictInt)
  49. { //如果当前词典查询类型是通过索引。
  50. //遍历所有词汇。
  51.  
  52. HASH_ITER(hh, m_pElements, pElement, tmp)
  53. {
  54. //取得每一个词汇的名称字符串放入CCArray中。
  55. CCInteger* pOneKey = new CCInteger(pElement->m_iKey);
  56. pOneKey->autorelease();
  57. pArray->addObject(pOneKey);
  58. }
  59. }
  60.  
  61. return pArray;
  62. }
  63. //取得对应CCObject指针的所有关键字或索引值。
  64. CCArray* CCDictionary::allKeysForObject(CCObject* object)
  65. {
  66. //取得词汇的数量
  67. int iKeyCount = this->count();
  68. if (iKeyCount <= ) return NULL;
  69. //创建一个CCArray。
  70. CCArray* pArray = CCArray::create();
  71. //定义临时词汇指针变量。
  72. CCDictElement *pElement, *tmp;
  73. if (m_eDictType == kCCDictStr)
  74. { //如果当前词典查询类型是通过名称字符串。
  75. //遍历所有词汇。
  76. HASH_ITER(hh, m_pElements, pElement, tmp)
  77. {
  78. if (object == pElement->m_pObject)
  79. {
  80. //如果与指定的词汇相同,将其名称字符串放入CCArray中。
  81. CCString* pOneKey = new CCString(pElement->m_szKey);
  82. pArray->addObject(pOneKey);
  83. pOneKey->release();
  84. }
  85. }
  86. }
  87. else if (m_eDictType == kCCDictInt)
  88. { //如果当前词典查询类型是通过索引。
  89. //遍历所有词汇。
  90. HASH_ITER(hh, m_pElements, pElement, tmp)
  91. {
  92. //如果与指定的词汇相同,将其名称字符串放入CCArray中。
  93. if (object == pElement->m_pObject)
  94. {
  95. CCInteger* pOneKey = new CCInteger(pElement->m_iKey);
  96. pArray->addObject(pOneKey);
  97. pOneKey->release();
  98. }
  99. }
  100. }
  101. return pArray;
  102. }
  103. //通过查询关键字取得对应CCObject指针
  104. CCObject* CCDictionary::objectForKey(const std::string& key)
  105. {
  106. //当前词典查询类型值有效性判断。此处有错,应该改为:if (m_eDictType == kCCDictUnknown || m_eDictType == kCCDictInt) return NULL;
  107. if (m_eDictType == kCCDictUnknown && m_eDictType == kCCDictUnknown) return NULL;
  108. //要求当前词典查询类型为按字符串查询。
  109. CCAssert(m_eDictType == kCCDictStr, "this dictionary does not use string as key.");
  110. //定义临时词汇指针变量。
  111. CCObject* pRetObject = NULL;
  112. CCDictElement *pElement = NULL;
  113. //通过名称字符串查询哈希表中的相应词汇
  114. HASH_FIND_STR(m_pElements, key.c_str(), pElement);
  115. if (pElement != NULL)
  116. {
  117. //如果查询到词汇,返回其对应的CCObject指针
  118. pRetObject = pElement->m_pObject;
  119. }
  120. return pRetObject;
  121. }
  122. //通过查询索引取得对应CCObject指针
  123. CCObject* CCDictionary::objectForKey(int key)
  124. {
  125. //当前词典查询类型值有效性判。此处有错,应该改为:if (m_eDictType == kCCDictUnknown || m_eDictType == kCCDictStr) return NULL;
  126. if (m_eDictType == kCCDictUnknown && m_eDictType == kCCDictUnknown) return NULL;
  127. //要求当前词典查询类型为按字符串查询。
  128. CCAssert(m_eDictType == kCCDictInt, "this dictionary does not use integer as key.");
  129. //定义临时词汇指针变量。
  130. CCObject* pRetObject = NULL;
  131. CCDictElement *pElement = NULL;
  132. //通过索引查询哈希表中的相应词汇
  133. HASH_FIND_INT(m_pElements, &key, pElement);
  134. if (pElement != NULL)
  135. {
  136. //如果查询到词汇,返回其对应的CCObject指针
  137. pRetObject = pElement->m_pObject;
  138. }
  139. return pRetObject;
  140. }
  141. //通过查询关键字取得对应CCString指针,其实即要求存入词汇的CCObject指针是CCString实例对象指针。
  142. const CCString* CCDictionary::valueForKey(const std::string& key)
  143. {
  144. //将通过查询关键字取得对应CCString指针强转为CCString指针。
  145. CCString* pStr = (CCString*)objectForKey(key);
  146. if (pStr == NULL)
  147. {
  148. //如果没找到,返回空字符串
  149. pStr = CCString::create("");
  150. }
  151. return pStr;
  152. }
  153. //通过查询索引取得对应CCString指针,即要求存入词汇的CCObject指针是CCString实例对象指针。
  154. const CCString* CCDictionary::valueForKey(int key)
  155. {
  156. //将通过查询索引取得对应CCString指针强转为CCString指针。
  157. CCString* pStr = (CCString*)objectForKey(key);
  158. if (pStr == NULL)
  159. {
  160. //如果没找到,返回空字符串
  161. pStr = CCString::create("");
  162. }
  163. return pStr;
  164. }
  165. //设置一个CCObject和对应的名称存入词典。
  166. void CCDictionary::setObject(CCObject* pObject, const std::string& key)
  167. {
  168. //参数有效性判断
  169. CCAssert(key.length() > && pObject != NULL, "Invalid Argument!");
  170. //如果是第一次存入,记录查询类型为字符串类型。
  171. if (m_eOldDictType == kCCDictUnknown)
  172. {
  173. m_eOldDictType = kCCDictStr;
  174. }
  175. //将当前词典查询类型设为字符串查询类型。这个变量是可以省略的,因为要求词典查询类型为固定。只用m_eOldDictType就可以了。
  176. m_eDictType = kCCDictStr;
  177. CCAssert(m_eDictType == m_eOldDictType, "this dictionary does not use string as key.");
  178. //定义临时指针变量从词典中取得对应名称的词汇。
  179. CCDictElement *pElement = NULL;
  180. HASH_FIND_STR(m_pElements, key.c_str(), pElement);
  181. if (pElement == NULL)
  182. {
  183. //如果词典中没有此词汇,将此新词汇放入词典。
  184. setObjectUnSafe(pObject, key);
  185. }
  186. else if (pElement->m_pObject != pObject)
  187. {
  188. //如果词典中已有此词汇,则删除老词汇放入新词汇。
  189. CCObject* pTmpObj = pElement->m_pObject;
  190. //此处调用retain对引用计数器加1可以避免在后面的删除函数中释放pTmpObj指向的CCObject。
  191. pTmpObj->retain();
  192. //删除此词汇
  193. removeObjectForElememt(pElement);
  194. //放入新词汇。
  195. setObjectUnSafe(pObject, key);
  196. //因为之前retain对引用计数器加1一次,所以必须release对引用计数器减1一次才能保证由内存管理器来进行内存释放时,pTempObj指向的CCObject可以正确的被释放掉。
  197. pTmpObj->release();
  198. }
  199. }
  200.  
  201. //设置一个CCObject和对应的哈希索引存入词典。
  202. void CCDictionary::setObject(CCObject* pObject, int key)
  203. {
  204. //参数有效性判断
  205. CCAssert(pObject != NULL, "Invalid Argument!");
  206. //如果是第一次存入,记录查询类型为索引类型。
  207. if (m_eOldDictType == kCCDictUnknown)
  208. {
  209. m_eOldDictType = kCCDictInt;
  210. }
  211. //将当前词典查询类型设为索引查询类型。这个变量是可以省略的,因为要求词典查询类型为固定。只用m_eOldDictType就可以了。
  212. m_eDictType = kCCDictInt;
  213. //一致性判断
  214. CCAssert(m_eDictType == m_eOldDictType, "this dictionary does not use integer as key.");
  215. //定义临时指针变量从词典中取得对应名称的词汇。
  216. CCDictElement *pElement = NULL;
  217. HASH_FIND_INT(m_pElements, &key, pElement);
  218. if (pElement == NULL)
  219. {
  220. //如果词典中没有此词汇,将此新词汇放入词典。
  221. setObjectUnSafe(pObject, key);
  222. }
  223. else if (pElement->m_pObject != pObject)
  224. {
  225. //如果词典中已有此词汇,则删除老词汇放入新词汇。
  226. CCObject* pTmpObj = pElement->m_pObject;
  227. //此处调用retain对引用计数器加1可以避免在后面的删除函数中释放pTmpObj指向的CCObject。
  228. pTmpObj->retain();
  229. //删除此词汇
  230. removeObjectForElememt(pElement);
  231. //放入新词汇。
  232. setObjectUnSafe(pObject, key);
  233. //因为之前retain对引用计数器加1一次,所以必须release对引用计数器减1一次才能保证由内存管理器来进行内存释放时,pTempObj指向的CCObject可以正确的被释放掉。
  234. pTmpObj->release();
  235. }
  236.  
  237. }
  238. //按照查询关键字找到对应CCObject并删除。
  239. void CCDictionary::removeObjectForKey(const std::string& key)
  240. {
  241. //当前词典是否有效
  242. if (m_eOldDictType == kCCDictUnknown)
  243. {
  244. return;
  245. }
  246. //当前词典的查询类型是否为字符串名称查询方式
  247. CCAssert(m_eDictType == kCCDictStr, "this dictionary does not use string as its key");
  248. //参数有效性判断
  249. CCAssert(key.length() > , "Invalid Argument!");
  250. //定义临时指针变量从词典中取得对应名称的词汇。
  251. CCDictElement *pElement = NULL;
  252. HASH_FIND_STR(m_pElements, key.c_str(), pElement);
  253. //从词典中删除相应的词汇。
  254. removeObjectForElememt(pElement);
  255. }
  256.  
  257. void CCDictionary::removeObjectForKey(int key)
  258. {
  259. //当前词典是否有效
  260. if (m_eOldDictType == kCCDictUnknown)
  261. {
  262. return;
  263. }
  264. //当前词典的查询类型是否为索引查询方式
  265. CCAssert(m_eDictType == kCCDictInt, "this dictionary does not use integer as its key");
  266. //定义临时指针变量从词典中取得对应索引的词汇。
  267. CCDictElement *pElement = NULL;
  268. HASH_FIND_INT(m_pElements, &key, pElement);
  269. //从词典中删除相应的词汇。
  270. removeObjectForElememt(pElement);
  271. }
  272. //将CCObject实例指针与对应的字符串名称存入哈希表。
  273. void CCDictionary::setObjectUnSafe(CCObject* pObject, const std::string& key)
  274. {
  275. //对pObject指向的实例对像引用计数器加1,即告诉其被词典使用.避免万一其的其它使用者都不再使用时被内存管理器释放.
  276. pObject->retain();
  277. //由pObject和名称字符串产生一个新的词汇。
  278. CCDictElement* pElement = new CCDictElement(key.c_str(), pObject);
  279. //将新的词汇放入哈希表中。
  280. HASH_ADD_STR(m_pElements, m_szKey, pElement);
  281. }
  282. //将CCObject实例指针与对应的索引存入哈希表。
  283. void CCDictionary::setObjectUnSafe(CCObject* pObject, const int key)
  284. {
  285. //对pObject指向的实例对像引用计数器加1,即告诉其被词典使用.避免万一其的其它使用者都不再使用时被内存管理器释放.
  286. pObject->retain();
  287. //由pObject和名称字符串产生一个新的词汇。
  288. CCDictElement* pElement = new CCDictElement(key, pObject);
  289. //将新的词汇放入哈希表中。
  290. HASH_ADD_INT(m_pElements, m_iKey, pElement);
  291. }
  292.  
  293. //按照容器中的查询关键字找到对应CCObject并删除。
  294. void CCDictionary::removeObjectsForKeys(CCArray* pKeyArray)
  295. {
  296. //遍历CCArray实例对像的所有名称字符串,查询与之对应的词汇。并删除。
  297. CCObject* pObj = NULL;
  298. CCARRAY_FOREACH(pKeyArray, pObj)
  299. {
  300. CCString* pStr = (CCString*)pObj;
  301. removeObjectForKey(pStr->getCString());
  302. }
  303. }
  304. //从词典中删除相应的词汇。
  305. void CCDictionary::removeObjectForElememt(CCDictElement* pElement)
  306. {
  307. //参数有效性判断
  308. if (pElement != NULL)
  309. {
  310. //从哈希表中删除pElement指向的词汇
  311. HASH_DEL(m_pElements, pElement);
  312. //前面在将词汇加入词典时对引用计数器加1,这里删除词汇是就应该对引用计数器减1。
  313. pElement->m_pObject->release();
  314. //释放词汇
  315. CC_SAFE_DELETE(pElement);
  316. }
  317. }
  318. //从词典中清空所有的词汇。
  319. void CCDictionary::removeAllObjects()
  320. {
  321. //定义遍历哈希表所用的指针变量
  322. CCDictElement *pElement, *tmp;
  323. //遍历哈希表
  324. HASH_ITER(hh, m_pElements, pElement, tmp)
  325. {
  326. //删除词汇并释放
  327. HASH_DEL(m_pElements, pElement);
  328. pElement->m_pObject->release();
  329. CC_SAFE_DELETE(pElement);
  330. }
  331. }
  332. //重载CCObject的拷贝函数。产生一个一模一样的词典。
  333. CCObject* CCDictionary::copyWithZone(CCZone* pZone)
  334. {
  335. //参数有效性判断
  336. CCAssert(pZone == NULL, "CCDirctionary should not be inherited.");
  337. //创建一个新的词典
  338. CCDictionary* pNewDict = new CCDictionary();
  339. //定义用来遍历的临时变量
  340. CCDictElement* pElement = NULL;
  341. CCObject* pTmpObj = NULL;
  342. //如果是索引查询方式
  343. if (m_eDictType == kCCDictInt)
  344. {
  345. //遍历所有词汇
  346. CCDICT_FOREACH(this, pElement)
  347. {
  348. //产生遍历词汇对应的CCObject的COPY,生成新的词汇放入新的词典中.
  349. pTmpObj = pElement->getObject()->copy();
  350. pNewDict->setObject(pTmpObj, pElement->getIntKey());
  351. pTmpObj->release();
  352. }
  353. }
  354. else if (m_eDictType == kCCDictStr)
  355. {
  356. //如果是名称字符串查询方式.
  357. //遍历所有词汇
  358. CCDICT_FOREACH(this, pElement)
  359. {
  360. //产生遍历词汇对应的CCObject的COPY,生成新的词汇放入新的词典中.
  361. pTmpObj = pElement->getObject()->copy();
  362. pNewDict->setObject(pTmpObj, pElement->getStrKey());
  363. pTmpObj->release();
  364. }
  365. }
  366.  
  367. return pNewDict;
  368. }
  369. //静态函数,取得单例的词典,内部调用create函数。
  370. CCDictionary* CCDictionary::dictionary()
  371. {
  372. return CCDictionary::create();
  373. }
  374. //静态函数,取得单例的词典。
  375. CCDictionary* CCDictionary::create()
  376. {
  377. //创建一个新的词典
  378. CCDictionary* pRet = new CCDictionary();
  379. if (pRet != NULL)
  380. {
  381. //将其设为由引用计数器来判断释放时机.交由内存管理器进行管理.
  382. pRet->autorelease();
  383. }
  384. //返回新创建的词典指针
  385. return pRet;
  386. }
  387. //静态函数,取得一个指定词典的COPY,内部调用createWithDictionary函数.
  388. CCDictionary* CCDictionary::dictionaryWithDictionary(CCDictionary* srcDict)
  389. {
  390. return CCDictionary::createWithDictionary(srcDict);
  391. }
  392. //静态函数,取得一个指定词典的COPY.
  393. CCDictionary* CCDictionary::createWithDictionary(CCDictionary* srcDict)
  394. {
  395. //查生一个指定词典的COPY.
  396. CCDictionary* pNewDict = (CCDictionary*)srcDict->copy();
  397. pNewDict->autorelease();
  398. return pNewDict;
  399. }
  400.  
  401. //声明静态函数:从一个plist文件中加载词典内容,此函数是多线程安全的,其内部调用 createWithContentsOfFileThreadSafe函数。
  402. extern CCDictionary* ccFileUtils_dictionaryWithContentsOfFileThreadSafe(const char *pFileName);
  403.  
  404. //静态函数:从一个plist文件中加载词典内容,此函数是多线程安全的.
  405. CCDictionary* CCDictionary::dictionaryWithContentsOfFileThreadSafe(const char *pFileName)
  406. {
  407. return CCDictionary::createWithContentsOfFileThreadSafe(pFileName);
  408. }
  409. //静态函数:从一个plist文件中加载词典内容,此函数是多线程安全的.
  410. CCDictionary* CCDictionary::createWithContentsOfFileThreadSafe(const char *pFileName)
  411. {
  412. //这里调用Cocos2d-x的文件函数集中的带多线程安全的从plist文件加载词典函数实现相应功能.
  413. return ccFileUtils_dictionaryWithContentsOfFileThreadSafe(pFileName);
  414. }
  415.  
  416. //静态函数:从一个plist文件中加载词典内容,其内部调用 createWithContentsOfFile函数。
  417. CCDictionary* CCDictionary::dictionaryWithContentsOfFile(const char *pFileName)
  418. {
  419. return CCDictionary::createWithContentsOfFile(pFileName);
  420. }
  421. //静态函数:从一个plist文件中加载词典内容.
  422. CCDictionary* CCDictionary::createWithContentsOfFile(const char *pFileName)
  423. {
  424. CCDictionary* pRet = createWithContentsOfFileThreadSafe(pFileName);
  425. pRet->autorelease();
  426. return pRet;
  427. }
  428.  
  429. NS_CC_END

CCDictionary(转)的更多相关文章

  1. cocos2d CCDictionary

    CCDictionary* dict=CCDictionary::create(); CCString* str1=CCString::create("); CCString* str2=C ...

  2. CCDictionary&CCArray执行retain()重要点

    CCDictionary也需要执行retain(),否则则跟CCArray,返回则释放对象. 在Lua中,忘记了retain(),导致一些出现gCCDictionary:objectForKey(ke ...

  3. 7.数据本地化CCString,CCArray,CCDictionary,tinyxml2,写入UserDefault.xml文件,操作xml,解析xml

     数据本地化 A CCUserDefault 系统会在默认路径cocos2d-x-2.2.3\projects\Hello\proj.win32\Debug.win32下生成一个名为UserDef ...

  4. CCDictionary

    /** * CCDictionary is a class like NSDictionary in Obj-C . * * @note Only the pointer of CCObject or ...

  5. cocos2d-x3.0 用CCDictionary写文件

    bool CDownLoad_LocalData::WriteToConfigFile( DownLoadLocalData* downdata ){ CCDictionary* pDict = CC ...

  6. CCDictionary 用调试器查看问题

    if(dic->objectForKey("uid")) uid = dic->valueForKey("uid")->getCString( ...

  7. !cocos2d ccdictionary->retain()的问题

    我再a类当中生命了一个dict,将它带入到b类当中,但没有在b类初始化时retain,于是在update当中找不到了.啃爹不.记得retain()

  8. 【Cocos2d-x for WP8 学习整理】(5)文字显示全整理

    学习 Cocos2d-x 有一阵了,现在要做个小东西,第一步就遇到了文字展示的问题,于是想把可能遇到的问题统统整理一下.这一部分也不局限于wp8,全平台应该都是一个解决方案. 先在脑袋里大致想了一下, ...

  9. [原创]cocos2d-x研习录-第三阶 特性之瓦片地图集

    由于一张大的世界地图或背景图片往往可以由屈指可数的几种地形来表示,每种地形对应于一张小的图片,我们称这些小的地形图片为瓦片.把这些瓦片拼接在一起,组合成一个完整的地图,这就是瓦片地图集的基本原理. C ...

随机推荐

  1. iOS \U7ea2 乱码 转换

    通常网络请求的数据,如果不做处理在输出时显示是 \U 之类的编码的: 不需要导入别的类库解决方法 - (NSString *)replaceUnicode:(NSString *)unicodeStr ...

  2. android 随手记 读写文件的几种方式

    java中多种方式读文件 一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内容 4.随机读取文件内容 */ import java.io.BufferedRe ...

  3. UML类图聚集与组合的区别

    http://blog.csdn.net/zwf0713/article/details/2025922 设计模式中组合和聚集好像挺相似,但有一定区别. 1-在图上的区别是,聚集用空心,组合用实心: ...

  4. Linux不用使用软件把纯文本文档转换成PDF文件的方法

    当你有一大堆文本文件要维护的时候,把它们转换成PDF文档会好一些.比如,PDF更适合打印,因为PDF文档有预定义布局.除此之外,还可以减少文档被意外修改的风险. 要将文本文件转换成PDF格式,你要按照 ...

  5. wso2esb安装及helloworld

    1.系统环境 Ubuntu12.04    192.168.0.97    root/password找管理员 Ubuntu12.04    192.168.0.99    root/password ...

  6. HTTP协议详解之响应篇

    #xiaodeng #状态码 #HTTP权威指南 62 #http响应由3部分组成:状态行.消息报头.响应正文.HTTP-Version Status-Code Reason-Phrase CRLF# ...

  7. Web文件管理、私有云存储管理工具 DzzOffice

    DzzOffice-大桌子办公系统本身是一款图形化,简单易用的网盘管理软件.可以实现将企业的局域网服务器.企业私有云存储.企业租用的公有云存储(如阿里云OSS).企业员工的私有云存储(如百度网盘.Dr ...

  8. Oracle PUP(PRODUCT_USER_PROFILE)配置和使用

    近期在翻Oracle SQLPLUS官方文档,在讲SQLPLUS Security章节介绍了PUP这个机制.借此.我来使用下面: PUP(PRODUCT_USER_PROFILE)介绍   PRODU ...

  9. Opcode查看利器之vld

    简介 在PHP的生命周期中 词法分析(zend_language_scanner),将PHP代码转换为语言片段(Tokens) 语法分析(zend_language_parser)将Tokens转换成 ...

  10. 使用bootstrap标签页

    关键字:使用标签页,静态调用html页面(使用iframe内联框架) 完整代码如下: <!DOCTYPE html> <html lang="en"> &l ...