iOS性能優(yōu)化-使用位段提高委托模式下的程序效率

什么是位段掘譬?

位段(bit-field)是以位為單位來定義結(jié)構(gòu)體(或聯(lián)合體)中的成員變量所占的空間泰演。含有位段的結(jié)構(gòu)體稱為位段結(jié)構(gòu)。
優(yōu)點:采用位段結(jié)構(gòu)既能夠節(jié)省空間葱轩,又方便于操作睦焕。
拓展鏈接:什么是位段?

分析

在實現(xiàn)委托模式時靴拱,如果協(xié)議中的方法是可選的垃喊,經(jīng)常需要寫代碼來判斷某個委托對象是否能響應(yīng)特定的選擇子,那么就會出現(xiàn)下列代碼:

if ([_delegate respondsToSelector:@selector(personDidSomething:)]) {
     [_delegate personDidSomething:something];
}

但是在委托對象本身沒變的情況下缭嫡,如果頻繁執(zhí)行此操作的話缔御,那么除了第一次檢測結(jié)果是有用之外,后續(xù)的檢測可能都是多余的妇蛀。在這里耕突,可以把委托對象是否能響應(yīng)某個協(xié)議方法這一信息緩存起來,以優(yōu)化代碼執(zhí)行的效率评架。

案例

@class Man;
@protocol ManDelegate
@optional
- (void)man:(Man)man playGame:(NSString *) game;
- (void)man:(Man)man eatFood:(NSString *)food;
@end

我們可以使用結(jié)構(gòu)體來存儲某個代理是否用respondsToSelector方法檢測過眷茁。先在Man類下聲明一個結(jié)構(gòu)體:

@interface Man () {
    struct {
       unsigned int playGame : 1;
    }_delegateFlags;
}

在上述結(jié)構(gòu)體中,playGame位段占用1個二進(jìn)制位纵诞,它可以表示0或1這兩個值上祈。我們可以通過下面的方法操作上述兩個位段。

//set
 _delegateFlags.playGame  = 1;
//get
if (?!_delegateFlags.playGame) {}

實現(xiàn)緩存功能所用的代碼可以寫在delegate屬性所對應(yīng)的設(shè)置方法里:

- (void)setDelegate:(id<ManDelegate>)delegate {
    _delegate = delegate;
    _delegateFlags.playGame = [delegate respondsToSelector:@selector(man:playGame:)];
}

這樣的話浙芙,每次調(diào)用delegate的相關(guān)方法之前登刺,就不用檢測委托對象是否能響應(yīng)給定的選擇子了,而是直接查詢結(jié)構(gòu)體里的標(biāo)識嗡呼。

優(yōu)化前

if ([_delegate respondsToSelector:@selector(man:playGame:)]) {
   [_delegate man:self playGame:game];
}

優(yōu)化后

if (_delegateFlags.playGame) {
  [_delegate man:self playGame:game];
}

在相關(guān)代理方法需要調(diào)用多次時纸俭,這種緩存優(yōu)化策略還是很有必要的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末南窗,一起剝皮案震驚了整個濱河市揍很,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌万伤,老刑警劉巖窒悔,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異敌买,居然都是意外死亡简珠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門虹钮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來北救,“玉大人荐操,你說我怎么就攤上這事≌洳撸” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵宅倒,是天一觀的道長攘宙。 經(jīng)常有香客問我,道長拐迁,這世上最難降的妖魔是什么蹭劈? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮线召,結(jié)果婚禮上铺韧,老公的妹妹穿的比我還像新娘。我一直安慰自己缓淹,他們只是感情好哈打,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著讯壶,像睡著了一般料仗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伏蚊,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天立轧,我揣著相機(jī)與錄音,去河邊找鬼躏吊。 笑死氛改,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的比伏。 我是一名探鬼主播胜卤,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凳怨!你這毒婦竟也來了瑰艘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤肤舞,失蹤者是張志新(化名)和其女友劉穎紫新,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體李剖,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡芒率,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了篙顺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偶芍。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡充择,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匪蟀,到底是詐尸還是另有隱情椎麦,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布材彪,位于F島的核電站观挎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏段化。R本人自食惡果不足惜嘁捷,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望显熏。 院中可真熱鬧雄嚣,春花似錦、人聲如沸喘蟆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽履肃。三九已至仔沿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尺棋,已是汗流浹背封锉。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留膘螟,地道東北人成福。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像荆残,于是被迫代替她去往敵國和親奴艾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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

  • 一 位段内斯,我相信老牌C語言愛好者蕴潦,指定很熟悉。它是以位為單位來定義結(jié)構(gòu)體(或聯(lián)合體)中的成員變量所占的空間俘闯。含有位...
    LeoZzz閱讀 335評論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理潭苞,服務(wù)發(fā)現(xiàn),斷路器真朗,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,499評論 25 707
  • 突然降臨的霧霾此疹,瞬間讓人們無法喘息,抬頭一片霧茫茫,讓人心生恐懼蝗碎,不敢在這樣的環(huán)境中多待哪怕是一秒湖笨。出門一會兒,嗓...
    今天安好閱讀 197評論 0 0
  • 鼓勵人們努力的文章幾乎占了雞湯文的絕大多數(shù)蹦骑。但過度的努力有時會讓人迷失自我慈省。 我看過這樣一個題目:所有的堅持其實都...
    如果有如果x閱讀 740評論 6 8