前言
协议:签订这些条款,后半生灵魂为我所有,我将马上赋予你死神的力量。
目标
掌握协议的使用。
内容
1.协议
遵守协议意味着你承诺实现该协议的所有方法。
在ObjC中使用@protocol定义一组方法规范,实现此协议的类必须实现对应的方法。熟悉面向对象的童鞋都知道接口本身是对象行为描述的协议规范。也就是说在ObjC中@protocol和其他语言的接口定义是类似的,只是在ObjC中interface关键字已经用于定义类了,因此它不会再像C#、Java中使用interface定义接口了。
事实上,Objective-C的协议正是受Java接口的启发。
2.声明协议
例:
@protocol NSCopying
- (id) copyWithZone:(NSZone *) zone;
@end
声明协议的语法看起来和声明类或类别的语法有点像,不过这里使用的不是@interface,而是使用@protocol,这是告诉编译器:“下面将是一个新的正式协议。”@protocol后面是协议的名称,协议名称必须要唯一。
你也可以继承父协议,这点与继承父类相似。尖括号里是父协议。
@protocol MySuperDuberProtocol <MyParentProtocol>
@end
再看一个例子,这是Cocoa的NSCoding协议:
@protocol NSCoding
-(void)encodeWithCoder:(NSCoder *)encoder;
-(id)initWithCoder:(NSCoder *)decoder;
@end
当某个类采用NSCoding协议时,便意味着该类承诺将实现这两个方法。
4.协议和数据类型
id类型表示一个可以指向任何类型的对象的指针,它是一个泛型对象类型。
如果一个用尖括号括起来的协议名称跟随在id之后,则编译器(以及阅读此代码的人)将知道你会接受任意类型的对象,但前提你要遵守该协议。
例:
-(void)setObjectValue:(id<NSCopying>)object;
编译器在编译该方法时,将检查参数类型,如果没有遵守协议则提出警告,如“class ‘Triangle”does not implement the ‘NSCopying’ protocol。
Objective-C 2.0增加了两个新的协议修饰符:@optional和@required.
@optional 可选实现的方法
@required 必须实现的方法(不设置则默认是这个)
代码说明:
假设我们定义了一个动物的协议AnimalDelegate,人员Person这个类需要实现这