iOS协议委托模式实现一对一的回调,当频繁执行此操作的话的,可以吧委托对象能否相应某个协议方法这一信息缓存起来,以优化程序效率。
讲方法响应能力缓存起来的最佳途径是使用”位段“数据类型,这是一项C语言特性,但在此处用起来却正合适。我们可以吧结构体中的某个字段所占用的二进制位个数设为特定的值。比如像这样:
struct data {
unsigned int fieldA : 8;
unsigned int fieldA : 4;
unsigned int fieldA : 2;
unsigned int fieldA : 1;
};
在结构体中,fieldA 位段将占用8个二进制位,于是fieldA 可以表示0 至 255 之间的值,fieldD表示0或1这两个值,我们可以像fieldD这样,把委托对象是否实现了协议中的相关方法这一信息缓存起来。
@interface test(){
struct {
unsigned int didTest : 1;
}_delegateFlags;
}
这个结构体用来缓存委托对象是否能响应特定的选择子。实现缓存功能的代码可以写在delegate set方法里面:
- (void)setDelegate:(id<test>)delegate {
_delegate = delegate;
_delegateFlags.didTest = [delegate respondsToSelector:@selector(test:)];
}
这样的话,每次调用delegate的相关方法之前,就不用检测委托对象是否能响应给定的选择子了,而是直接查询结构体的标志:
if(_delegateFlags.didTest){
[_delegate test];
}
如果要频繁通过数据源协议从数据源中获取多份相互独立的数据,那么这项优化技术极有可能提高程序效率。
摘自 《Effective Objective-C2.0》
网友评论