OC中如何优化代理是否响应某个方法
来源:互联网 发布:linux 添加永久路由 编辑:程序博客网 时间:2024/05/22 16:06
看以下示例代码:
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];}
又涨姿势了有木有!!!
0 1
- OC中如何优化代理是否响应某个方法
- 如何要在Swift工程中调用OC文件 以及 如何调用某个类的方法
- Spring MVC中如何指定某个类或方法自适配地响应某个HTTP请求?
- Java中如何通过代码知道某个方法或某个类是否在声明时被标注为deprecated?
- OC基础day5-点语法、property、编译器指令、id万能指针、类与类的判断、判断对象是否响应指定的方法、判断类中是否有这个方法、参数方法与响应、构造方法、synthesize
- python 中如何判断list中是否包含某个元素
- python 中如何判断list中是否包含某个元素
- python 中如何判断list中是否包含某个元素
- 在java中如何使用代理访问某个页面
- .net C# 如何判断一个对象是否具有某个方法
- 如何判断DropDownList中是否包含某个项
- 如何在PHP中判断某个函数是否被支持
- VFP中如何判断某个用户是否连上SQL
- 如何判断Oracle中某个字段的值是否重复
- 如何判断IP地址是否在某个IP段中
- 如何高效检查一个数组中是否包含某个值
- 如何判断某个字段中是否完整包含某一字符串
- Android开发中如何判断是否安装了某个程序
- python中,花括号,中括号,小括号的区别
- JavaScript 类型总览
- 枚举
- 解决ie缓存的问题
- [水]ZOJ1382
- OC中如何优化代理是否响应某个方法
- Linux 编译安装Boost
- 实现PhoneGap应用里的消息推送
- 深入理解Delete(JavaScript)
- Java动态连接Matlab
- linux系统文件加压缩命令汇总
- SPI
- 图解TCP三次握手和连接终止
- MySQL数据库插入数据,中文乱码问题解决