协议

作者: gpylove | 来源:发表于2019-11-21 17:41 被阅读0次

        协议是任何类都能够选择实现的程序接口。协议能够使两个没有继承关系的类相互交流并完成特定的目的,因此它提供了除继承外的另一种选择。任何能够为其他类提供有用行为的类都能够声明接口来匿名的传达这个行为。任何其他类都能够选择遵守这个协议并实现其中的一个或多个方法,从而利用这个行为。如果协议遵守者实现了协议中的方法,那么声明协议的类就能够通过遵守者调用协议中的方法。 iOS中的协议本质是一组方法列表,用来规范接口,只声明不需要实现,实现的部分由代理者完成

1.协议只能声明方法,不能声明属性

注意: 如果没有使用任何关键字修饰协议中的方法,那么该方法默认就是@required。如果协议中的方法是@required的,而代理者又没有实现该方法,那么会报一个警告。 如果协议中的方法是@optional的,而代理者又没有实现该方法,那么不会报警告。无论是@required还是@optional声明的方法,而代理者又没有实现该方法,但是委托方调用了改方法,必然crash。所以委托方在调用协议中的方法时候,最好加上判断

if(_delegate && [_delegater espondsToSelector:@selector(testProtocolAction)])

2.OC中的协议又可以遵守其它协议,只要一个协议遵守了其它协议,那么这个协议中就会自动包含其它协议的声明方法

3.父类遵守了某个协议,那么子类也会自动遵守这个协议

假设你自定义一个继承自UITextField的子类MyTextFeild,同时自定义一个代理MyTextFeildDelegate的属性如下:

@property (nonatomic, weak) id<MyTextFeildDelegate> delegate;

这时候会报警告,因为这个delegate与父类的delegate的协议冲突。一个解决办法是上面2中提到的,将自定义的协议遵守父类中的协议。

@protocol MyTextFieldDelegate<UITextFieldDelegate>

这时候同时更改MyTextFeildDelegate的属性如下:

@property (nonatomic, weak) id<MyTextFeildDelegate> myTFDelegate;

在代理者设置代理的时候只设置myTFDelegate为自己就可以了。

4.委托方设置协议为自己的属性时,用weak弱引用修饰,避免造成循环引用

相关文章

  • git协议

    git支持的协议 local协议 https协议 ssh协议 git协议 github常用的协议

  • Dubbo服务 上传文件解决方案以及Hessian协议

    协议支持Dubbo支持多种协议,如下所示: Dubbo协议 Hessian协议 HTTP协议 RMI协议 WebS...

  • Procotol 和 Delegate

    目录 Procotol 协议的概念 协议的分类 协议的定义 协议的遵循 协议的方法 协议的属性 Delegate ...

  • 计算机网络题目

    几种协议分别属于哪一层传输层协议:TCP协议、UDP协议应用层协议:FTP、HTTP、SMTP网络层协议:IP协议...

  • ARP协议

    地址解析协议ARP 网络层四大协议:ARP协议,IP协议,ICMP协议,IGMP协议。 ARP(Address R...

  • IP数据报格式

    前言 先回顾一下TCP/IP协议栈 网络层的协议有IP协议、ARP协议、ICMP协议和IGMP协议。其中IP协议是...

  • 名词解析

    网络层:IP协议 : 网络协议ICMP协议: Internet互联网控制报文协议 ->IP协议的附属协议 IP...

  • 如何将Git仓库备份到本地

    git常用的传输协议传输协议.png哑协议:哑协议传输进度不可见;智能协议传输可见。传输速度:智能协议比哑协议传输...

  • NSURLSession学习笔记

    �Http协议-超文本传输协议 Http协议是应用层协议,底层要求的传输协议必须是可靠的传输协议,通常是TCP协议...

  • dubbo支持的7种协议 (1)

    支持的协议有哪些。 1、dubbo 协议 (默认) 2、rmi 协议 3、hessian 协议 4、http 协议...

网友评论

      本文标题:协议

      本文链接:https://www.haomeiwen.com/subject/trqtwctx.html