(轉(zhuǎn))CFBag

前文,看到技術(shù)美文,忍不住想拿出來分享.下面是原文地址

點(diǎn)擊原文地址

Objective-C被夾在了兩個(gè)世界中間

在其中一邊的世界里芭梯,Objective-C遵循著經(jīng)過深思熟慮的蓝丙、發(fā)揚(yáng)自[Smalltalk]的面向?qū)ο笳軐W(xué)理念畔柔,這種理念給我們帶來了消息傳遞和參數(shù)命名法等好點(diǎn)子。另一邊的世界里則避免不了有很多C的殘留思想帶來強(qiáng)大的力量和一坨混亂

越來越多@符號的使用證明了這個(gè)一致性危機(jī)弧哎。

Foundation和Core Foundation的關(guān)系里也可以發(fā)現(xiàn)這種一致性問題邢滑,特別是那一堆無縫連接的類: NSArray / CFArray, NSDictionary / CFDictionary, NSSet / CFSet。這些類可以通過C函數(shù)和Objective-C方法傳入傳出而不需要手動轉(zhuǎn)換。這是抽象化設(shè)計(jì)的缺陷彬碱,但是同時(shí)也是寫應(yīng)用時(shí)最實(shí)用的優(yōu)化最難以優(yōu)化部分的絕佳手段豆胸。

Bag,一種抽象數(shù)據(jù)類型

在計(jì)算機(jī)科學(xué)領(lǐng)域集合數(shù)據(jù)類型的殿堂中巷疼,bag沒有數(shù)組晚胡、集合、聯(lián)合數(shù)組嚼沿、樹估盘、圖、優(yōu)先隊(duì)列那么占有一席之地骡尽。

其實(shí)bag本身就很晦澀遣妥,你可能從沒聽過這東西。

Bag攀细,或者叫做multiset箫踩,是set的一種變體,不同的是bag里同一數(shù)據(jù)可以出現(xiàn)不止一次谭贪。集合中每一個(gè)唯一元素會有一個(gè)合計(jì)數(shù)字與其綁定境钟。類似set一樣,bag也是順序不敏感的俭识。

用bag的場景有...咳咳...很少慨削,但有如果它出現(xiàn)你肯定能感覺到那就是bag。大選中統(tǒng)計(jì)票數(shù)?模擬家庭作業(yè)中的概率分布缚态?實(shí)現(xiàn)一個(gè)Yahtzee骰子游戲磁椒?Bag都是你的新選擇!


使用CFMutableBag

CFBag 和它的可變類型同類 CFMutableBag 作為bag類型的具體實(shí)現(xiàn)猿规,都是非常靈活的衷快。

雖然它們沒有像 NSCountedSet 那樣方便地面向?qū)ο蠡梢赃M(jìn)行的自定義行為卻是多種多樣的姨俩。你可以用帶有許多回調(diào)的初始化函數(shù)來建立一個(gè) CFBag 蘸拔,這些回調(diào)函數(shù)定義在 CFBagCallBacks 結(jié)構(gòu)中,該結(jié)構(gòu)詳細(xì)描述了一個(gè)值被插入环葵、刪除调窍、比較的方法:

struct CFBagCallBacks {

CFIndex version;

CFBagRetainCallBack retain;

CFBagReleaseCallBack release;

CFBagCopyDescriptionCallBack copyDescription;

CFBagEqualCallBack equal;

CFBagHashCallBack hash;

};

typedef struct CFBagCallBacks CFBagCallBacks;

retain: 當(dāng)一個(gè)值被添加到集合里時(shí)用于retain它的回調(diào)

release: 當(dāng)一個(gè)值被從集合里刪除時(shí)用于release它的回調(diào)

copyDescription: 用于集合中每個(gè)值建立一個(gè)string類型的description的回調(diào)

equal: 用于比較集合中兩個(gè)值是否相等的回調(diào)

hash: 集合中用于計(jì)算值的Hash的回調(diào)

例如,如果你正在做一個(gè)投票統(tǒng)計(jì)應(yīng)用张遭,你可以制定一個(gè)用于 retain 回調(diào)函數(shù)來保證不同大小寫和錯(cuò)誤拼寫的名字能夠歸類到正確的候選人邓萨;也可以用 equal 回調(diào)函數(shù)來保證當(dāng)所有選票都統(tǒng)計(jì)完時(shí)能夠計(jì)算出票最多的候選人。

CFMutableBag 也有 CFBagApplyFunction菊卷,這個(gè)函數(shù)可以用來改變集合中的值缔恳,比如說理順選舉數(shù)量之類的。

總而言之洁闰,如果你要準(zhǔn)備搞一個(gè)選舉歉甚, CFBag 是你的最佳選擇。

嚴(yán)肅地講扑眉, CFBag 在它擅長的領(lǐng)域內(nèi)確實(shí)好用纸泄,它時(shí)刻提醒著你這是標(biāo)準(zhǔn)框架和標(biāo)準(zhǔn)庫中的一塊隱藏的寶石,而發(fā)覺隱藏的寶藏腰素,就是成為一個(gè)NSHipster的核心聘裁。

同樣的,CFBinaryHeap 呢弓千? NSPointerFunctions 呢衡便? NSMapTable 呢?有心想學(xué),善用搜索引擎!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洋访,一起剝皮案震驚了整個(gè)濱河市砰诵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捌显,老刑警劉巖茁彭,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扶歪,居然都是意外死亡理肺,警方通過查閱死者的電腦和手機(jī)摄闸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妹萨,“玉大人年枕,你說我怎么就攤上這事『跬辏” “怎么了熏兄?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長树姨。 經(jīng)常有香客問我摩桶,道長,這世上最難降的妖魔是什么帽揪? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任硝清,我火速辦了婚禮,結(jié)果婚禮上转晰,老公的妹妹穿的比我還像新娘芦拿。我一直安慰自己,他們只是感情好查邢,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布蔗崎。 她就那樣靜靜地躺著,像睡著了一般扰藕。 火紅的嫁衣襯著肌膚如雪缓苛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天实胸,我揣著相機(jī)與錄音,去河邊找鬼番官。 笑死庐完,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的徘熔。 我是一名探鬼主播门躯,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酷师!你這毒婦竟也來了讶凉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤山孔,失蹤者是張志新(化名)和其女友劉穎懂讯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體台颠,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡褐望,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘫里。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡实蔽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谨读,到底是詐尸還是另有隱情局装,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布劳殖,位于F島的核電站铐尚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏闷尿。R本人自食惡果不足惜塑径,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望填具。 院中可真熱鬧统舀,春花似錦、人聲如沸劳景。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盟广。三九已至闷串,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筋量,已是汗流浹背烹吵。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桨武,地道東北人肋拔。 一個(gè)月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像呀酸,于是被迫代替她去往敵國和親凉蜂。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容