七、Objective-C 协议Protocol
一、协议定义
1、协议事实上是一组方法的列表,它并不依赖于特定的类。使用协议可以使不同的类共享相同的消息。java中的接口和协议十分类似。
2、通常我们把一些共有的方法抽象出来写一个协议。协议仅仅是声明方法的集合体,实现方法则由各个类自行完成。
3、使用协议的情况下,如果类实现了该协议的所有方法,称为类遵循该协议。类的子类实例因为继承关系也拥有了这些协议方法。因为子类实例也是父类的对象,所以子类也能执行父类的协议操作。
4、当类适用于某个协议时,它的实例也适用于这个协议。
5、协议通常写在单独的.h文件里,也可以和类的头文件写在一起。名字一般和文件名相同
6、协议也是可以继承的,直接在protocol后面的协议名Speciality 跟上需要继承的协议即可。
7、使用协议的时候,需要在类的头文件类名的后面跟上协议名 <Speciality,otherProtocolName>多个协议用“,”隔开。
8、遵循协议后,协议里的方法无需再次在类的头文件里声明。
9、required是必须实现的方法,optional可以不用实现。没有关键字修饰的也是必须实现的方法。
10、协议里的必须实现的方法,当你不实现的时候虽然编译器不会报错,编译器在编译的时候也会报出警告。当你执行到这个方法的时候程序就会崩溃报出异常。
举例:
// Speciality.h
@protocol Speciality <NSObject>
- (void)showName;
@required
- (void)sing;
- (void)dance;
@optional
- (void)removeGirlFriend;
@required
- (void)addGirlFriend;
@end
// Student.h
#import "Speciality.h"
@interface Student : NSObject <Speciality>
@end
// Student.m
#import "Student.h"
@implementation Student
- (void)dance {
NSLog(@"dance");
}
- (void)sing {
NSLog(@"sing");
}
@end
二、协议的类型声明
我们可以声明某个对象适用于某个协议
id <Speciality> obj;
- (voidd) addPersson:(Person <Speciality> * ) p;
有两个方法可以检测对象是否适用于协议
+ (BOOL) comformsToProtocol: (Protocol *) aProtocol
- (BOOL) comformsToProtocol: (Protocol *) aProtocol
例如检测obj是否适用协议Speciality
if ( [obj comformsToProtocol:@protocol(Speciality)] )
声明的作用
声明过后,当你传入的参数没有遵循这个协议的时候,编译时就会提示一个大大的警告。起到了警醒的作用。
三、非正式协议
我们可以将一组方法声明为NSObject的类别,这成为非正式协议。 即凡是NSObject或其子类Foundation框架中的类增加的类别,都是非正式协议。
1、非正式协议被声明为NSObject类的类别
2、非正式协议中声明的的方法不一定要实现
3、编译时,不能检查类对非正式协议的适用性
4、运行时,不能检查类对非正式协议的适用性。只能确认是否实现了每个方法。