首页 > 代码库 > OC中如何优化代理是否响应某个方法
OC中如何优化代理是否响应某个方法
看以下示例代码:
if([_delegate respondsToSelector: @selector(someClassDidSomething:)){ [_delegate someClassDidSomething]; }
一般情况下,我们在写代理的时候都是这样判断某个对象有没有实现代理中的某个方法。这样固然可以,但是如果某个代理方法调用的频率非常非常高,因为在调用这个代理方法的时候,都需要做一次if判断,if判断的时候又要执行respondsToSelector:方法,所以效率会显得很低下。此时,我们可以采用缓存的办法,来进行优化。
在C语言中有一种乏人问津的特性——可以把结构体中得某个字段在内存中所占用的位数设置为特定的值。
比如:
struct data{ unsigned int fieldA : 8; unsigned int fieldB : 4; unsigned int fieldC : 2; unsigned int fieldD : 1; };
在这个结构体中,fieldA占8位,所以可以表示的范围是0~255,fieldD只占一位,则可以表示的数是0和1。0和1能表示什么,很明显,可以用来表示布尔(BOOL)类型的值。
现在看优化的代码如下:
@protocol EOCNetworkFetcherDelegate @optional -(void)networkFetcher:(EOCNetworkFetcher *)fetcher didReceiveData:(NSData *)data; -(void)networkFetcher:(EOCNetworkFetcher *)fetcher didFailError:(NSError *)error; -(void)networkFetcher:(EOCNetworkFetcher *)fetcher didUpdateProgressTo:(float)progress; @end
优化代码:
@interface EOCNetworkFetcher(){ struct{ unsigned int didReceiveData : 1; unsigned int didReceiveData : 1; unsigned int didReceiveData : 1; } _delegateFlags; } @end
在setDelegate中,可以写以下代码,来优化:
-(void)setDelegate:(id<EOCNetworkFetcher>)delegate{ _delegate = delegate; _delegateFlags.didReceiveData =[delegate respondsToSelector:@selector(networkFetcher:didReceiveData:)]; _delegateFlags.didFailWithError =[delegate respondsToSelector:@selector(networkFetcher:didFailWithError:)]; _delegateFlags.didUpdateProgressTo =[delegate respondsToSelector:@selector(networkFetcher:didUpdateProgressTo:)]; }
在设置完delegate以后,就可以采用_delegateFlags中的具体标志而不需要每次都调用respondsToSelector:来判断是否响应了某个方法。
if(_delegateFlags.didUpdateProgressTo){ [_delegate networkFetcher:self didUpdateProgressTo:currentProgress]; }
OC中如何优化代理是否响应某个方法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。