Objective-C协议
协议是什么
协议是一系列方法的声明,没有类的定义,协议声明的方法会被使用协议的类实现,任何类都可以使用协议,并实现它的方法
Objective-C提供一种正式声明一组方法的途径,这就是协议。
声明一个协议
通过一个@protocol指令来声明一个正式的协议
@protocol ProtocolName
method declarations
@end
可选的协议方式
协议方法可以通过@optional关键字标识为可选,@required关键字标示为必选,如果你没有指定任何关键字,那么默认为@required
非正式协议
除了正式协议,你也可以定义一个非正式协议,通过将将方法组织在一个类别声明中
非正式协议通常声明为NSObject类的类别,因为几乎每个类都会继承NSObject类
有时,非正式协议也被称为抽象(abstract)协议
采用一个协议
采用一个协议类似于声明一个父类,因为两者都会给这个类分配方法。父类的声明分配它继承的方法,协议的声明分配它在协议列表中的方法。如过一个类在它的声明中,把协议列在了它父类声明后面的尖括号中,就说明它采用了一个正式协议
@interface ClassName : ItSuperclass <protocol list>
在类别中采用协议也类似
@interface ClassName (CategoryName) <protocol list>
一个类可以采用多个协议,协议列表通过逗号分隔
@interface Classname : ItSuperclass <p1, p2, p3>
采用了协议的类或者类别必须实现所有协议声明中要求实现的方法,否则编译器将给出警告
采用了协议的类或者类别必须导入协议位置头文件并且无需再次声明
一个类可以光采用协议而不定义自己的方法
通过给对象发送conformsToProtocol消息检查是否遵循了某个协议
类型检查
可以扩展对象的类型声明,给编译器提供另一种级别的类型检查
id <person> aObject;
这里将所有遵循person协议的对象归为一个类型,编译器可以确保只有遵循这个协议的对象被赋予这个类型
协议中的协议
协议中可以使用其他协议,语法跟类采用协议一样
@protocol ProtocolName <protocol list>
任何遵循了协议的对象也要遵循协议中的协议
向前引用协议
@protocol ProtocolName
使用@protocol指令时,会通知编译器,ProtocolName是一个晚些时候会定义的协议,它是存在的。