协议与委托
一. 协议
1. 类似于接口,用于定义多个类应该遵守的规范:
并不关心这些类的内部状态数据,也不关心这些类里方法的具体实现,只是规定这些类要提供某些方法。
2. 使用@protocol关键字:
1 @protocol 协议名 <父协议1, 父协议2, ...> 2 { 3 statement... 4 }
注意:
-
- 一个协议可以继承多个协议,但是协议不能继承类
- 方法:只是声明,没有具体实现。
3. 遵守协议的类(即代理):
- 如果没有实现协议中的所有方法,编译器会发出警告:
- @optional:声明的方法可选择是否实现
- @required:声明的方法是必须要实现的。@required是默认行为
@protocol FKPersonAction // 定义协议的方法 @optional - (void) makeUp; @required - (void) walk; @end
可选实现makeup方法,但是必须实现walk方法,否则编译器就会提示警告
4. 声明对象的方法:
- 方法一:实现类定义对象
FKPerson *person = [[FKPerson alloc] init];
- 方法二:协议来定义对象
- NSObject<协议1, 协议2, ...> *变量;
- id<协议1, 协议2, ...> *变量;
- 注意:
- 采用协议来定义对象,类似于其他语言使用接口定义变量的语法
- 采用协议来定义对象,对象的编译时类型仅仅是所遵守的协议类型,所以只能调用该协议中定义的方法
二. 协议与委托(delegate)
1. 协议体现的是一种规范,定义协议的类可以把协议定义的方法委托给实现协议的类,这样可以让类定义具有更好的通用性,因为具体的动作将有该协议的实现类去完成。