协议

        协议是任何类都能够选择实现的程序接口。协议能够使两个没有继承关系的类相互交流并完成特定的目的,因此它提供了除继承外的另一种选择。任何能够为其他类提供有用行为的类都能够声明接口来匿名的传达这个行为。任何其他类都能够选择遵守这个协议并实现其中的一个或多个方法,从而利用这个行为。如果协议遵守者实现了协议中的方法,那么声明协议的类就能够通过遵守者调用协议中的方法。 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弱引用修饰,避免造成循环引用

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本章将会介绍 协议语法属性要求方法要求(Method Requirements)Mutating 方法要求构造器要...
    寒桥阅读 427评论 0 3
  • 协议 定义了一个蓝图,规定了用来实现某一特定任务或者功能的方法、属性,以及其他需要的东西。类、结构体或枚举都可以遵...
    CDLOG阅读 453评论 0 0
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,138评论 1 32
  • 人所拥有的任何东西都可以被剥夺,唯独人性最后的自由-也就是在任何境遇中选择一已态度和生活方式的自由-不能被剥夺。 ...
    深色皮肤阅读 192评论 0 0
  • 今天是2017年的第2天。我们无法改变世界形势,国家政策,以及单位文化。我们能做的只是寻找自己的方向,然后努力地前...
    在路上的古兰阅读 120评论 0 0