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中如何优化代理是否响应某个方法的更多相关文章
- 1218.1——OC中的常见关键字及一些基本方法
OC常见的关键字介绍: @ 看到这个关键字,我们就应该想到,这是Object-C对C语言的扩展,例如@interface XXX. @interface 声明类 @implementation 实现类 ...
- OC中保存自定义类型对象的持久化方法
OC中如果要将自定义类型的对象保存到文件中,必须进行以下三个条件: 想要把存放自定义类型的数组进行 持久化(就是将内存中的临时数据以文件<数据库等>的形式写到磁盘上)必须满足: 1. 自定 ...
- 【Objective-C】OC中KVO的基本概念和使用方法
基本概念: 键值观察是一种使用获取其他对象的特定属性变化的通知机制. 控制器层的绑定技术就是严重依赖键值观察获得模型层和控制器层的变化通知的. 对于不依赖控制器层类的应用程序,键值观察提供了一种简化的 ...
- oc中的各种遍历(迭代)方法
转载自文顶顶老师的博客:http://www.cnblogs.com/wendingding/p/5251937.html 说明: 1)该文简短介绍在ios开发中遍历字典.数组和集合的集中常见方式 2 ...
- OC中快速创建NSNumber NSDictionary NSArray的方法
NSNumber: @() @小括号 或者 NSNumber * num = @3; NSValue * value = @4; NSDictionary :@{} @大括 ...
- OC中的代理模式
OC中的代理模式,关于代理模式,如果还有同学不太清楚的话,就自己去补充知识了,这里就不做介绍了,这里只介绍OC中是如何实现代理模式的.这里举一个简单的例子:小孩类,护士类,保姆类,其中小孩类有两个方法 ...
- iOS开发之swift与OC混编出现的坑,oc中不能对swift的代理进行调用,不能访问swift中的代理,swift中的回调方法
1. Swift与oc混编译具体怎么实现,这儿我就不重复讲出了,网上有大把的人讲解. 2. 在swift与OC混编的编译环境下, oc类不能访问swift创建类中的代理? 解决方法如下: 在代理的头部 ...
- (转载)OC学习篇之---代理模式
在前一篇文章我们介绍了OC中的协议的概念,这篇文章我们就来介绍一下OC中的代理模式,关于代理模式,如果还有同学不太清楚的话,就自己去补充知识了,这里就不做介绍了,这里只介绍OC中是如何实现代理模式的. ...
- OC中的self指针
在OC中,self是一个指针,方法和属性可以通过self.function进行访问:成员变量使用self->变量名进行访问.调用方法还可以用[self function]; OC中的self有点 ...
随机推荐
- 【转】Ubuntu FireFox无法播放网页视频音乐的解决办法
原文:http://www.codeweblog.com/%E8%A7%A3%E5%86%B3qq%E9%9F%B3%E4%B9%90%E7%BD%91%E9%A1%B5%E7%89%88%E5%9C ...
- SpringDataJPA - 复杂查询总结 (多表关联 以及 自定义分页 )
实体类 @Entity @Table(name = "t_hotel") @Data public class THotel { @Id private int id; priva ...
- React Native 项目整合 CodePush 全然指南
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/y4x5M0nivSrJaY3X92c/article/details/81976844 作者 | 钱 ...
- [IR] Advanced XML Compression - ISX
Ori paper: http://www.cse.unsw.edu.au/~wong/papers/www07.pdf ISX Requirements 1 Space does matter fo ...
- [IR] Suffix Trees and Suffix Arrays
前缀树 匹配前缀字符串是不言自明的道理. 1. 字符串的快速检索 2. 最长公共前缀(LCP) 等等 树的压缩 后缀树 Let s=abab, a suffix tree of s is a comp ...
- 06建造者模式Builder
一.什么是建造者模式 Builder模式也叫建造者模式或者生成器模式, 是由GoF提出的23种设计模式中的一种. Builder模式是一种对象创建型模式之一,用来 隐藏复合对象的创建过程,它把复合对象 ...
- SVN 命令行的使用
大多数时候我们用TortoiseSVN作为客户端,其实SVN提供了强大的客户端命令行工具,和Git差不不多. 1. 查看工作副本修改的整体状况. $ svn status ? scratch.c A ...
- 构建工具:grunt、Glup、webpack
相关代码已上传至github 怎么是项目构建? 编译项目中的js, sass, less: 合并js/css等资源文件: 压缩js/css/html等资源文件: JS语法的检查. 构建工具的作用? 简 ...
- image-set实现Retina屏幕下图片显示详细介绍
支持image-set:如果你的浏览器支持image-sete,而且是普通显屏下,此时浏览器会选择image-set中的@1x背景图像: Retina屏幕下的image-set:如果你的浏览器支持im ...
- 【本周面试题】第2周 - js单线程和异步相关问题
硬性知识点考察: 为什么js是单线程的? 因为js设计最初是为了操作dom而生,如果是多线程的,当多个线程同时修改一个dom时就会产生冲突,所以设计成单线程,一次只能做一件事. 既然是单线程为什么要有 ...