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

位段,我相信老牌C語言愛好者,指定很熟悉。它是以位為單位來定義結(jié)構體(或聯(lián)合體)中的成員變量所占的空間。含有位段的結(jié)構體稱為位段結(jié)構。使用位段可以節(jié)省空間,提升開發(fā)效率。

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

  if ([_delegate respondsToSelector:@selector(showName:)]) {
        [_delegate showName:@"Joshua"]
    }

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

#import <Foundation/Foundation.h>

@protocol TestDelegate  <NSObject>
- (void)showName:(NSString *) name;
@end

struct  {
    unsigned int showNames : 1;
}_delegateFlags;
@interface Test : NSObject
@property (nonatomic,weak) id <TestDelegate> delegate;
- (void)log;
@end

#import "Test.h"

@implementation Test
- (void)setDelegate:(id<TestDelegate>)delegate {
    _delegate = delegate;
    _delegateFlags.showNames = [_delegate respondsToSelector:@selector(showName:)];
}
@end

在上述方法中結(jié)構體_delegateFlags位段占用1個二進制位,它可以表示0或1這兩個值,即真、假。這樣的話,每次調(diào)用delegate的相關方法之前,就不用檢測委托對象是否能響應給定的方法了,而是直接查詢結(jié)構體里的標識。
優(yōu)化后

if (_delegateFlags.showNames) {
        [_delegate showName:@"123"];
    }

優(yōu)化前

 if ([_delegate respondsToSelector:@selector(showName:)]) {
        [_delegate showName:@"Joshua"]
    }

在相關代理方法需要調(diào)用多次時 可以使用位段來緩存,可以很大的提示開發(fā)效率。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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