http://blog.csdn.net/jackystudio/article/details/16958587
CCDictionary在cocos2d-x中被大量的应用,比如CCTexureCache,CCSpriteFramCache等等。
1.实现原理
1.1.uthash
CCDictionary是使用uthash实现的,而过时的CCMutableDictionary则是使用STL实现,就效率而言CCDictionary至少提升了两倍,而且CCDictionary并没有使用C++模版,因此也很容易绑定到脚本。
uthash是一个C/C++的哈希表实现,它以宏定义的方式实现了哈希表,不仅加快了运行速度,而且与key类型无关。它的github地址是https://github.com/troydhanson/uthash。cocos2d-x的头文件在cocos2d-x-2.2.0cocos2dxsupportdata_supportuthash.h。
如果想在C++中直接使用也很简单,userguide在这里:http://troydhanson.github.io/uthash/userguide.html。可以很方便地进行增加,删除,查找,计数,迭代,排序等操作。
1.2.键(key)
uthash支持4种标准类型的键:整型,字符串,指针和结构体,不过到了CCDictionary就只支持整型和字符串型了。
- enumCCDictType
- {
- kCCDictUnknown=0,
- kCCDictStr,
- kCCDictInt
- };
2.CCDictElement
在了解CCDictionary之前还要看一下CCDictElement,很明显,CCDictElement是CCDictionary的一个元素,包含了一个key-value。key支持整型和字符串,使用的时候要注意在同一个CCDictionary中key类型必须要一致,value可以不一致。
3.API
3.1.创建
- staticCCDictionary*create();
-
- staticCCDictionary*createWithDictionary(CCDictionary*srcDict);
-
- staticCCDictionary*createWithContentsOfFile(constchar*pFileName);
-
-
- staticCCDictionary*createWithContentsOfFileThreadSafe(constchar*pFileName);
3.2.查找
- CCObject*objectForKey(conststd::string&key);
-
- CCObject*objectForKey(intptr_tkey);
-
- constCCString*valueForKey(conststd::string&key);
-
- constCCString*valueForKey(intptr_tkey);
3.3.增加
-
- voidsetObject(CCObject*pObject,conststd::string&key);
-
-
- voidsetObject(CCObject*pObject,intptr_tkey);
3.4.移除
- voidremoveObjectForKey(conststd::string&key);
- voidremoveObjectForKey(intptr_tkey);
-
- voidremoveObjectsForKeys(CCArray*pKeyArray);
-
- voidremoveObjectForElememt(CCDictElement*pElement);
-
- voidremoveAllObjects();
3.5.其他
- CCObject*randomObject();
-
- CCArray*allKeys();
-
- CCArray*allKeysForObject(CCObject*object);
-
- unsignedintcount();
-
- boolwriteToFile(constchar*fullPath);
4.示例
- CCDictionary*pDict=CCDictionary::create();
-
-
- CCString*pValue1=CCString::create("100");
- CCString*pValue2=CCString::create("120");
- CCInteger*pValue3=CCInteger::create(200);
- pDict->setObject(pValue1,"key1");
- pDict->setObject(pValue2,"key2");
- pDict->setObject(pValue3,"key3");
-
- CCString*pStr1=(CCString*)pDict->objectForKey("key1");
- CCLog("{key1:%s}",pStr1->getCString());
- CCInteger*pInteger=(CCInteger*)pDict->objectForKey("key3");
- CCLog("{key3:%d}",pInteger->getValue());
- CCString*pStr3=static_cast<CCString*>(pDict->randomObject());
- CCLog("{randomkey:%s}",pStr3->getCString());
- if(pDict->writeToFile("pdic.plist"))
- CCLog("Writetofilesuccess!");
Resource/pdic.plist
<?xmlversion="1.0"encoding="UTF-8"?>
- <!DOCTYPEplistPUBLIC"-//Apple//DTDPLIST1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd"/>
- <plistversion="1.0">
- <dict>
- <key>key1</key>
- <string>100</string>
- <key>key2</key>
- <string>120</string>
- <key>key3</key><!key3对应整型数据无法写入/>
- </dict>
- </plist>
5.CCDICT_FOREACH
5.1.概况
宏定义,用于遍历CCDictionary的value。
#defineCCDICT_FOREACH(__dict__,__el__)
- CCDictElement*pTmp##__dict__##__el__=NULL;
- if(__dict__)
- HASH_ITER(hh,(__dict__)->m_pElements,__el__,pTmp##__dict__##__el__)
5.2.示例
CCDictElement*pElement;
- CCDICT_FOREACH(dict,pElement)
- {
- constchar*key=pElement->getStrKey();
-
- CCSprite*pSprite=(CCSprite*)pElement->getObject();
-
- }
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|