一
位段,我相信老牌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ā)效率。