在iOS开发中,经常使用代理模式和数据源模式,对于可选的协议方法一般需要进行以下代码查处某个委托对象是否能相应特定的选择子:
if (_delegate && [_delegate respondsToSelector:@selector(homeNamePhoneCell:beginEditing:)]) {
[_delegate homeNamePhoneCell:self beginEditing:textField];
}
可是如果频繁执行此操作的话,那么除了第一次监测的结果有用之外,后续的监测可能是多余的。如果委托对象本身没有变,那么不大可能会突然响应某个原来不响应的选择子,也不大会突然无法项目某个原来可以响应的选择子。鉴于此,我们可以考虑是否可以把委托对象能否响应某个协议方法这一信息缓存起来,以优化程序的效率。
在C语言中有一个叫“位段”的数据类型可以用来将响应方法缓存起来,当然也可以通过自定义属性来缓存,我们这里使用“位段”进行缓存。
具体实现代码如下:
@interface KKHomeNamePhoneCell (){
struct {
unsigned int textFieldValueChange : 1;
unsigned int textFieldBeginEditing : 1;
}_delegateFlags;
}
@end
- (void)setDelegate:(id<KKHomeNamePhoneCellDelegate>)delegate {
_delegate = delegate;
_delegateFlags.textFieldValueChange = [delegate respondsToSelector:@selector(homeNamePhoneCell:tag:text:)];
_delegateFlags.textFieldBeginEditing = [delegate respondsToSelector:@selector(homeNamePhoneCell:beginEditing:)];
}
这样的话每次调用delegate的相关方法之前,就不用监测委托对象是否能响应给定的选择子,而是直接查询结构体里的表示即可以
if (_delegateFlags.textFieldValueChange) {
}
在相关方法要调用很多次时,可以进行这种优化。当然是否需要优化应当依照具体的代码而定,这就需要分析代码的性能,若是发现执行速度需要进行优化改进,则可以使用这种技巧,如果要频繁通过数据源中获取多份相互独立的数据,那么这项优化技术极有可能会提高程序效率。