前文,看到技術(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é),善用搜索引擎!