2015-02-28 | code

Objective-C 协议

目录

协议就是声明方法的集合,与具体实现无关,java中的interface也是吸收了协议这个概念.

###协议声明

1
2
3
@protocol 协议名
//...
@end

###协议使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@interface 类名 : 父类 <协议名>
{
//...
}
//...
@end

//可同时采用多个协议
@interface 类名 : 父类 <协议1,协议2...>
{
//...
}
//...
@end

//范畴中使用协议
@interface 类名 (范畴) <协议1,协议2...>
//...
@end




###协议继承

1
2
3
@protocol 协议名 <协议名>
//...
@end

###指定协议的类型声明

id <S> obj;
- (void)addElement:(id<s>) elem;

###协议的前置声明

//声明S这个名字是一个协议
@protocol S;

###协议适用性检查

1
2
3
4
5
6
7
8

+ (BOOL)conformsToProtocol: (Protocol*) aProtocol;
- (BOOL)conformsToProtocol: (Protocol*) aProtocol;
//使用编译器命令符@protocol()就可以获得指定协议数据的指针

if( [obj conformsToProtocol:@protocol(YourProtocol)])...



###协议的必须按功能和可选功能

@optional 可选的

@required 必选的,默认状态

1
2
3
4
5
6
7
8
9
10
@protocol Book
- (void)setBookName:(NSString*)bookname;

@optional
- (void)setBookMark:(int)page;
- (void)setXXXX:(XX)XX;

@required
- (void)setOwnerName:(NSString*)owner;


###以上部分协议也被称为正式协议 下面是非正式协议

将一组方法声明为NSObject的范畴 这称为非正式协议

  • 非正式协议中的方法不一定要实现
  • 编译时不能检查类对非正式协议的适用性
  • 运行时不能检查类对非正式协议的适用性,只能确认是否实现了方法