iOS 使用位段為你的協(xié)議實(shí)現(xiàn)緩存功能

在設(shè)計接口的時候钉迷,委托是常用的交互方式至非,一般的,我們在使用協(xié)議時會寫出以下代碼糠聪。

if ([delegate respondsToSelector:@selector(someMothod:)]) {
        [delegate someMothod:(id)sender];
    }

一般情況下沒有問題荒椭,事實(shí)上,以上代碼可以滿足大部分的需求舰蟆,但是假設(shè)你所實(shí)現(xiàn)的協(xié)議方法是一個類似網(wǎng)絡(luò)下載進(jìn)度回調(diào)的功能趣惠,每隔很短的小段時間就需要回調(diào)一次呢?

你會發(fā)現(xiàn),除了第一次檢測委托對象是否響應(yīng)某個選擇子有意義外身害,之后的檢測都是多余的味悄。如果委托對象本身沒變,那么不大可能會忽然不能響應(yīng)某個選擇子题造。鑒于此傍菇,我們可以把委托對象能否響應(yīng)某個協(xié)議方法這一信息緩存起來,已優(yōu)化程序效率界赔。

假設(shè)現(xiàn)在有一個進(jìn)度回調(diào)的協(xié)議方法

- (void)networkDidUpdateProgressTo:(float)progerss;

以上方法由于需要監(jiān)聽進(jìn)度丢习,需要頻繁地回調(diào)progress參數(shù),如果能夠緩存委托對象能否響應(yīng)的信息淮悼,我們就不必每次都去執(zhí)行以下函數(shù)

if ([delegate respondsToSelector:@selector(someMothod:)])

將方法相應(yīng)能力緩存起來的最佳途徑就是使用C語言的“位段”數(shù)據(jù)類型咐低。

這里簡單介紹一下位段:
什么是位段呢? 位段是 C 語言特有的數(shù)據(jù)結(jié)構(gòu), 它允許我們定義一個由位組成的段, 并可為它賦以一個名字。
二進(jìn)制位是數(shù)據(jù)的基本單位袜腥,它比字節(jié)還小见擦,一個字節(jié)由 8 位組成, 而在某些計算機(jī)系統(tǒng)中則可能是 16 位钉汗。
事實(shí)上,如果需要標(biāo)志一個信息鲤屡,一位就足夠了损痰,但是由于字節(jié)是存儲的最小單位,所以所有的變量至少要使用一個字節(jié)(比如BOOL值)酒来。
如果我們想在一個很大的表中存儲很多標(biāo)志, 那么 "被浪費(fèi)" 的內(nèi)存空間是很可觀的卢未。幸運(yùn)的是,在 C 語言中, 我們可以使用叫做位段的構(gòu)造類型來定義一個結(jié)構(gòu)體堰汉,從而定義某個字段所用的二進(jìn)制位個數(shù)為某個特定的值辽社。

struct data{                           //包含位段的結(jié)構(gòu)體
    unsigned int fieldA : 8;    //位段fieldA,占8二進(jìn)制位
    unsigned int fieldB : 4;    //位段fieldB翘鸭,占4二進(jìn)制位
    unsigned int fieldC : 2;    //位段fieldC滴铅,占2二進(jìn)制位
    unsigned int fieldD : 1;    //位段fieldD,占1二進(jìn)制位
}
//位段列表的形式為: 類型說明符 位域名:位域長度

以上結(jié)構(gòu)體中就乓,fieldA 位段將占用 8 個二進(jìn)制位汉匙,fieldB 則為 4個,以此類推生蚁。于是盹兢,fieldA 可以表示 0 至 255 之間的值,而fieldD可以表示 0 或 1 這兩個值守伸。

我們可以像 fieldD 這樣绎秒,把委托對象是否實(shí)現(xiàn)了協(xié)議中的相關(guān)方法這一信息緩存起來。如果創(chuàng)建的結(jié)構(gòu)體中只有大小為 1 的位段尼摹,那么就能把很多 Boolean 值塞入一小塊數(shù)據(jù)里面了(原來存一個BOOL值的空間见芹,現(xiàn)在能存8個),我們現(xiàn)在文件中聲明一個結(jié)構(gòu)體。

struct {
    unsigned int delegateMothod1 : 1;
    unsigned int delegateMothod2 : 1;
    unsigned int delegateMothod3 : 1;
}  _delegateFlags;

然后重寫我們的delegate的setter方法:

-(void)setDelegate:(id<personalDelegate>)delegate
{
    _delegate=delegate;
    _delegateFlags.delegateMothod1=[delegate respondsToSelector:@selector(delegateMothod1:)];
    _delegateFlags.delegateMothod2=[delegate respondsToSelector:@selector(delegateMothod2:)];
    _delegateFlags.delegateMothod3=[delegate respondsToSelector:@selector(delegateMothod3:)];
}

現(xiàn)在委托對象如果能夠相應(yīng)協(xié)議方法蠢涝,位段就可以將其以一位的大小緩存起來玄呛,然后我們在之后調(diào)用委托對象的相關(guān)方法時,就不用檢測委托對象是否能響應(yīng)給定的選擇子了和二,而是直接查詢結(jié)構(gòu)體里的標(biāo)志:

if (_delegateFlags._delegateFlags.delegateMothod1){
    [_delegate delegateMothod1:];
}

在相關(guān)方法要調(diào)用很多次的時候徘铝,值得進(jìn)行這種優(yōu)化,而是否需要優(yōu)化惯吕,則應(yīng)依照具體代碼來定惕它。這需要分析代碼性能,并找出瓶頸废登,若發(fā)現(xiàn)執(zhí)行速度需要改進(jìn)淹魄,則可使用此技巧。如果要頻繁通過數(shù)據(jù)源協(xié)議從數(shù)據(jù)源中獲取多分相互獨(dú)立的數(shù)據(jù)堡距,那么這項(xiàng)優(yōu)化技術(shù)極有可能會提高程序效率甲锡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兆蕉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缤沦,更是在濱河造成了極大的恐慌虎韵,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缸废,死亡現(xiàn)場離奇詭異劝术,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)呆奕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衬吆,“玉大人梁钾,你說我怎么就攤上這事⊙仿眨” “怎么了姆泻?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冒嫡。 經(jīng)常有香客問我拇勃,道長,這世上最難降的妖魔是什么孝凌? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任方咆,我火速辦了婚禮,結(jié)果婚禮上蟀架,老公的妹妹穿的比我還像新娘瓣赂。我一直安慰自己,他們只是感情好片拍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布煌集。 她就那樣靜靜地躺著,像睡著了一般捌省。 火紅的嫁衣襯著肌膚如雪苫纤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天纲缓,我揣著相機(jī)與錄音卷拘,去河邊找鬼。 笑死祝高,一個胖子當(dāng)著我的面吹牛恭金,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播褂策,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼横腿,長吁一口氣:“原來是場噩夢啊……” “哼颓屑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起耿焊,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤揪惦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后罗侯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體器腋,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年钩杰,在試婚紗的時候發(fā)現(xiàn)自己被綠了纫塌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡讲弄,死狀恐怖措左,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情避除,我是刑警寧澤怎披,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站瓶摆,受9級特大地震影響凉逛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜群井,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一状飞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧书斜,春花似錦昔瞧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至稍坯,卻和暖如春酬荞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞧哟。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工混巧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勤揩。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓咧党,卻偏偏與公主長得像,于是被迫代替她去往敵國和親陨亡。 傳聞我的和親對象是個殘疾皇子傍衡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

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

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,970評論 6 13
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,143評論 30 470
  • 從三月份找實(shí)習(xí)到現(xiàn)在深员,面了一些公司,掛了不少蛙埂,但最終還是拿到小米倦畅、百度、阿里绣的、京東叠赐、新浪、CVTE屡江、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,247評論 11 349
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法芭概,類相關(guān)的語法,內(nèi)部類的語法惩嘉,繼承相關(guān)的語法罢洲,異常的語法,線程的語...
    子非魚_t_閱讀 31,632評論 18 399
  • 早上經(jīng)彭老師確認(rèn)沒有下雨宏怔,我蹬上運(yùn)動鞋,背上小包包畴椰,準(zhǔn)備步行上班臊诊,到了樓下一看,明明淅淅瀝瀝下著雨斜脂,趕緊跑上樓...
    癟癟元子閱讀 254評論 1 3