Objective-C的协议(Protocol)——协议的声明及采用规则

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             

猜你喜欢

转载自blog.csdn.net/qq_33737036/article/details/81433552
今日推荐