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個二進制位,它可以表示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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容