【iOS_Development】delegate的使用优化
来源:互联网 发布:修改jenkins的端口 编辑:程序博客网 时间:2024/04/26 16:46
前言
相信做过iOS开发的人都使用过delegate(并不是设置模式中的proxy
),这里就以一个实例,来分享一下开发中大量使用某个delegate方法的优化方案
位段
位段,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。
struct data { unsigned int fieldA : 8; unsigned int fieldB : 4; unsigned int fieldC : 2; unsigned int fieldD : 1;}
在结构体中,fieldA位段将占用8个二进制位,fieldB占用4个,fieldC占用2个,fieldD占用1个。于是,fieldA可以表示0至255之间的值,而fieldD可以表示0或1这两个值,我们可以像fieldD这样,把委托对象是否实现了协议中的相关方法这一信息缓存起来。如果创建结构体中只有大小为1的位段,那么就能把许多Boolean值塞入一小块数据里面了。以网络数据获取器为例,可以在该实例中嵌入一个含有位段的结构体作为其实例变量,而结构体中的每个位段则表示delegate
对象是否实现了协议中的相关方法
delegate缓存
@interface NetworkFetcher () { struct { unsigned int didReceiveData : 1; unsigned int didFailWithError : 1; unsigned int didUpdateProgressTo : 1; }_delegateFlags;}@end
上面的实例变量是个结构体,其中含有三个位段,每个位段都与delegate所遵从的协议中某个可选(@optional
)方法相对应。这个结构体用来缓存委托对象是否能响应特定的选择子,实现缓存功能所用的代码可以写在delegate属性所对应的设置方法里
- (void)setDelegate:(id<NetworkFetcherDelegate>)delegate { _delegate = delegate; _delegate.didReceiveData = [delegate respondsToSelector:@selector(NetworkFetcher:didReceiveData)]; _delegate.didFailWithError = [delegate respondsToSelector:@selector(NetworkFetcher:didFailWithError)]; _delegate.didUpdateProgressTo = [delegate respondsToSelector:@selector(NetworkFetcher:didUpdateProgressTo)]; }
这样的话,每次调用delegate的相关方法之前,就不用检测委托对象是否能响应给定的选择子了,而是直接查询结构体里的标识
if (_delegate.didUpdateProgressTo) { [_delegate NetworkFetcher:self didUpdateProgressTo:currentProgess];}
在相关方法要调用多次时,值得进行这种优化,而是否需要优化,则应依照具体代码来定。这就需要分析代码性能,并找出瓶颈,若发现执行速度需要改进,则可使用该技巧。如果要频繁通过数据源协议从数据源中获取多份相互独立的数据,那么这项优化技术极有可能会提高程序效率
- 声明:本文摘自《Effective Objective C 2.0:编写高质量iOS与OS X代码的52个有效方法》
0 0
- 【iOS_Development】delegate的使用优化
- 【iOS_Development】广告图的添加
- 【iOS_Development】添加/隐藏UITabBar右上角的小红点
- iOS_Development~ 添加 / 隐藏 UITabBar 右上角的小红点
- delegate 委托的使用
- Delegate的使用实例
- delegate 的使用
- delegate的初使用
- UITableView delegate的使用
- delegate的使用
- Delegate的使用
- 对delegate的使用
- iOS Delegate 的使用
- Delegate的使用方式
- 使用delegate的步骤
- Delegate的使用场合
- 使用delegate的步骤
- iOS delegate 的使用
- PPM / PGM / PBM图像文件
- acm杭电HDU5245 Joyful 概率问题 期望值(2015上海邀请赛)
- hihocoder 完全背包
- 如何保证 docker daemon重启,但容器不重启
- 阿里云服务器部署tomcat、mysql以及nginx的步骤
- 【iOS_Development】delegate的使用优化
- 防止php重复提交表单更安全的方法
- HDU
- 10种纯css3制作的loading效果和源码分享
- 蓝桥杯:马虎的算式
- JVM加载class文件的原理机制是什么?类加载器的工作原理
- 视频电商网站
- 第三章 规划
- PHP 下载文件(中文不乱码)