内容简介:很多第三方框架中,有这样的一种用法:有一个.h的头文件,它里面只有协议的声明,而且没有对应的.m实现文件。通常这种文件就用来专职声明协议的作用了。这个框架里面有这样一段代码:
很多第三方框架中,有这样的一种用法:有一个.h的头文件,它里面只有协议的声明,而且没有对应的.m实现文件。通常这种文件就用来专职声明协议的作用了。
这里举一个大家都能看到和下载的例子,优秀的第三方图文混排框架: TYAttributedLabel 。
这个框架里面有这样一段代码:
// 添加响应点击rect
- (void)addRunRectDictionary:(NSDictionary *)runRectDictionary
{
if (runRectDictionary.count < _runRectDictionary.count) {
NSMutableArray *drawStorageArray = [[_runRectDictionary allValues]mutableCopy];
// 剔除已经画出来的
[drawStorageArray removeObjectsInArray:[runRectDictionary allValues]];
// 遍历不会画出来的
for (id
<tytextstorageprotocol>
drawStorage in drawStorageArray) {
if ([drawStorage conformsToProtocol:@protocol(TYViewStorageProtocol)]) {
[(id
<tyviewstorageprotocol>
)drawStorage didNotDrawRun];
}
}
}
_runRectDictionary = runRectDictionary;
}
</tyviewstorageprotocol>
</tytextstorageprotocol>
1.如何判断某对象是否服从指定协议
可以先关注这个:
if ([drawStorage conformsToProtocol:@protocol(TYViewStorageProtocol)])
这行代码主要做一个是否服从协议的判断。这个协议是声明在TYTextStorageProtocol.h文件里面的。大家查看这个文件可知,它里面主要声明了几个协议,而且没有对应的.m文件。
打开TYTextStorageProtocol.h查看协议的代码:
@protocol TYViewStorageProtocol <nsobject> /** * 设置所属的view */ - (void)setOwnerView:(UIView *)ownerView; /** * 不会把你绘画出来 */ - (void)didNotDrawRun; @end </nsobject>
2. 如何将未知类型的id对象转换成一个服从指定协议的对象
-
接下来关注这个:
[(id <tyviewstorageprotocol> )drawStorage didNotDrawRun]; </tyviewstorageprotocol>
这句话里面的didNotDrawRun方法是前面那个协议声明的方法,所以,只有当前面做了判断是否服从该协议之后,才可将暂时还是个id类型的drawStorage对象进行转换,转成一个服从该协议的对象,进而执行协议方法。
对象的转换:
(id <tyviewstorageprotocol> )drawStorage </tyviewstorageprotocol>
3.如何使对象服从指定协议
至于一个对象是否“服从”的标准:就是该对象的类或其父类的@interface后面跟上一个协议,并实现协议的方法。
接下来再这里的drawStorage对象,是怎样选择“服从” 协议TYViewStorageProtocol的:
-
TYViewStorage.h
#import "TYDrawStorage.h" @interface TYViewStorage : TYDrawStorage <tyviewstorageprotocol> @property (nonatomic, strong) UIView *view; // 添加view @end </tyviewstorageprotocol>
-
TYViewStorage.m
//TYViewStorageProtocol
- (void)didNotDrawRun
{
[_view removeFromSuperview];
}
拓展阅读:
区分class_conformsToProtocol与conformsToProtocol
https://blog.csdn.net/likendsl/article/details/7567719
作者:陈满iOS
链接:https://www.jianshu.com/p/ec124372be05
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入理解LINUX内核(第三版)
(美)博韦,西斯特 / 陈莉君;张琼声;张宏伟 / 中国电力出版社 / 2007-10-01 / 98.00元
为了彻底理解是什么使得Linux能正常运行以及其为何能在各种不同的系统中运行良好,你需要深入研究内核最本质的部分。内核处理CPU与外界间的所有交互,并且决定哪些程序将以什么顺序共享处理器时间。它如此有效地管理有限的内存,以至成百上千的进程能高效地共享系统。它熟练地统筹数据传输,这样CPU 不用为等待速度相对较慢的硬盘而消耗比正常耗时更长的时间。 《深入理解Linux内核,第三版》指导你对内核......一起来看看 《深入理解LINUX内核(第三版)》 这本书的介绍吧!