作用类似于接口。用于多个类应该遵守的方法。
协议定义的时多个类共同的公共行为规范,这些行为是于外部交流的通道,这就意味着协议里通常是定义一组公用方法,但不会为这些方法提供具体实现,方法的实现交给类去实现。
同一个类的内部数据、和方法的实现细节完全相同,但是
类是一种具体实现。而协议则规定了一种规范,协议定义某一批类所需要遵守的规范,不关心这些类的内部数据和方法的实现细节,只是规定遵循该协议的这一批类中必须提供某些方法,提供这些方法的类就可以满足实际需求。
协议不提供任何实现。协议体现的是规范和实现分离的设计哲学。
可以使用类别来实现非正式协议。但是Object-c 并不强制实现该协议中的所有的方法,当类中没有实现这些方法时可能就会出现错误。
遵守正式协议必须实现协议中定义的所有方法。可以通过@optional @required 来修饰协议
@optional :协议方法可选,可实现也可不实现
@required:协议方法必须遵守,必须实现。
正式协议定义:
@protocol 协议名 <父协议1,父协议2>
{
零到多个类或实例方法(协议)定义;
}
@end
point:
1、协议名和前面的类和类别从语法角度看很像
2、一个协议可以有多个直接的父协议
3、协议只能继承协议,不能继承类
4、协议中定义的方法只有方法签名,没有具体的方法实现
5、协议中定义的方法既可以是类方法,也可以是实例方法
遵守(实现)协议
在类定义的接口部分可以指定该类继承的父类,以及遵守的协议。一个类可以同时遵守多个协议。
@interface 类名 : 父类<协议1,协议2>
协议与委托delegate
协议体现的是一种规范,定义协议的类可以把协议定义的方法委托给实现协议的类,这样可以让类定义具有更好的通用性质,将具体的实现交给遵守该协议的类区实现。
使用协议来定义变量
NSObject<协议1,协议2> * 变量 ;