协议不提供任何实现,协议体现的是规范和实现分离的设计哲学,将规范和实现分离正是一种松耦合的设计。
协议类似于Java中的接口 interface
协议定义了多个类共同的公共行为规范,这些行为是与外部交流的通道,协议通常是一组公用的方法,但不会为这些方法提供实现,方法的实现交给类去实现。
非正式协议
即使用类别实现。
如@interface NSString(a1)
@interfaca NSString(a2)
实例#import <Foundation/Foundation.h>
@interface NSObject(a1)
-(void) test;
@end
#import <Foundation/Foundation.h>
#import "NSObject+test.h"
@implementation Apple
-(void) test{
}
@end
#import <Foundation/Foundation.h>
#import "Apple.h"
int main(int arg,char*[]arg1){
@autoreleasepool{
Apple* apple=[[Apple alloc] init];
[apple test];
}
}
注意:对于非正式协议类来说,协议内的方法并不需要全部实现。但是如果这个方法一直未被实现则会报错。
正式协议
正式协议不使用@interface、@implementation关键字,使用@protocol关键字,定义格式如下
@protocol 协议名<父协议1,父协议2>
{
定义多个方法,可以不定义
}
协议名与类名采用相同的命名规则、
一个协议可以有多个直接父协议,但是协议只能继承协议,不能继承类
协议中定义的方法只能有方法签名,没有方法体
实例
#import <Foundation/Foundation.h>
@protocol Test
-(void) a1;
-(void) a2;
@end
#import <Foundation/Foundation.h>
@protocol Test2
-(void) b1;
-(void)b2;
@end
#import <Foundation/Foundation.h>
#import "Test.h"
#import "Test2.h"
@protocol Test3 <Test,Test2>
-(void) c1;
@end
协议支持多继承,类不支持多继承。集成后,子协议会获取到父协议的所有方法。
实现协议
@interface 类名 :父类
#import <Foundation/Foundation.h>
#import "Test3.h"
//继承NSObject,实现Test3协议
@interface User :NSObject<Test3>
@end
#import “User.h"
@implementation User
-(void) a1{};
-(void) a2{};
-(void) b1{};
-(void) b2{};
-(void) c1{};
@end
int main{
NSObject<User>* user=[[User allo]init];
}
正式协议和非正式协议的区别
非正式协议通过为NSObject创建类别以实现;正式协议直接使用@protocol创建。
实现非正式协议通过继承带特定类别的NSObject来实现,@interface NSNumber(fk);实现正式协议则必须使用专有的方法,@interface User :NSObject<Test3>
实现非正式协议不需要实现协议中定义的所有方法,正式协议必须实现定义的所有方法。
为了弥补正式协议必须实现所有方法的缺陷,object-c 2.0新增@optional、@required关键字。
@optional:位于 该关键字之后、@optional或@end之前声明的方法时可选的。
@required: 位于该关键字之后、@required或者@end之间声明的方法是必须的。
实例;
@protocol Test
@optional
- (void) a1;
@required
- (void) a2;
@end