0x01 正式协议
这里所说的协议(Protocol)指的是相对于非正式协议(Informal Protocol)的正式协议。
与非正式协议一样,正式协议是包含了方法和属性的有名称列表。
但与非正式协议不一样的是,正式协议中声明的方法,必须显示地被采用。
采用协议(Protocol)就意味着必须实现协议中的需要实现的方法!
0x02 协议的声明
@Protocol指令用于协议的声明,协议名称在其之后并且必须唯一:
@protocol NSCopying
- (id) copyWithZone: (NSZone *) zone;
@end
还可以继承父协议,在声明语句的协议名称后面加上尖括号,尖括号内写父协议名:
@protocol MySuperDuberProtocol <MyParentProtocol>
//...
@end
//代码表示MySuperDuberProtocol协议继承于MyParentProtocol父协议
//因此遵循这个协议的对象必须实现两个协议中的需要实现的方法
在协议中不会引入新的实例变量!
通常可以用NSObject作为根协议,因为NSObject类符合NSObject协议,这意味着所有的对象都符合NSObject协议。
0x03 采用协议
要采用某个协议,可以在类的声明中列出协议名称,并用尖括号括起来:
@interface Car: NSObject <NSCopying>
{
// instance variables
}
// methods
@end // Car
如果某个类需要遵循多个协议,可以同时将两个协议写入尖括号,用逗号隔开,不必区分顺序:
@interface Car: NSObject <NSCopying, NSCoding>
{
// instance variables
}
// methods
@end // Car
0x04 协议与数据类型
可以在使用的数据类型中为实例变量和方法参数指定协议名称。这样可以给Objective-C的编译器提供更多信息,要求接受的对象必须符合某个协议:
- (void) setObjectValue: (id<NSCopying>) object;
0x05 协议的可选关键字
Objective-C 2.0中新增了两个协议修饰符:@optional和@required,为协议提供了更多灵活性。
@optional
@optional:这个表示该方法对于其他遵循协议的类实现是可选的。
@required
@required:这个表示这个方法是其他遵循协议的类必须实现的,协议的默认修饰符就是@required。
@protocol BaseballPlayer
- (void)drawHugeSalary; //默认必须实现drawHugeSalary:方法
@optional
- (void)slideHome;
- (void)catchBall;
- (void)throwBall; //可选的三个方法
@required
- (void)swingBat; //显式要求实现的swingBat:方法
@end // BaseballPlayer