协议
什么是协议
1.协议是多个对象之间协商的一个接口对象。
2.协议提供一系列方法用来在协议的实现者和代理者之间的一种通信方式
3.协议类似于c++中的纯虚函数,或者Java中的接口。
协议声明【放在.h文件中】
@protocol MyProtocol<NSObject> //MyProtocol 是协议的名字 <NSObject>是继承的一个基协议
//要定义的变量
-(void)init;
-(int)update:(int)time;
@end
@required 某一个方法必须得实现
@optional 某一个方法可以不实现
协议可以多继承
【例如】
@protocol MyProtocol//要定义的变量@optional //这里定义的方法可以不实现-(void)init;-(void)exit;@required //这里定义的方法必须实现-(int)update:(int)time;@end
如上的<MyProtocol>表示一个泛型
test是一个对象
[MyTest alloc]是一个类
【协议的实例】
【1】.首先先创建一个协议 Objective-C protocol
//// MyProtocol.h// pro6//// Created by 裴烨烽 on 14-1-24.// Copyright (c) 2014年 裴烨烽. All rights reserved.//#import@protocol MyProtocol @optional //可选的-(void)print:(int)value;@required-(int)printValue:(int)value1 andValue:(int)value2;//printValue:andValue:这个方法是必须要实现的@end
【2】.h方法里面声明协议
//// MyTest.h// pro6//// Created by 裴烨烽 on 14-1-24.// Copyright (c) 2014年 裴烨烽. All rights reserved.//#import#import "MyProtocol.h" //调用.h@interface MyTest : NSObject -(void)showInfo;@end
【3】.m文件里面写方法
//// MyTest.m// pro6//// Created by 裴烨烽 on 14-1-24.// Copyright (c) 2014年 裴烨烽. All rights reserved.//#import "MyTest.h"@implementation MyTest-(void)showInfo{ NSLog(@"show info is calling");}//下面这 2个方法是来源于MyProtocol协议-(int)printValue:(int)value1 andValue:(int)value2{ NSLog(@"print value value1 %d value2 %d",value1,value2); return 0;}-(void)print:(int)value 【1】{NSLog(@"print value %d",value); 【2】}@end
【4】main()
//// main.m// pro6//// Created by 裴烨烽 on 14-1-24.// Copyright (c) 2014年 裴烨烽. All rights reserved.//#import#import "MyTest.h"#import "MyProtocol.h"int main(int argc, const char * argv[]){ @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); MyTest *myTest=[[MyTest alloc]init]; [myTest showInfo]; SEL sel=@selector(print:); 【3】 //这个print:转化成SEL类型的方法 if([myTest respondsToSelector:sel]){ 【4】 //判断myTest是否响应sel方法(print:) [myTest print:20]; 【5】 } [myTest print:20]; //如果在上面的.m文件里面的【1】【2】方法,也就是.h里面@optional(可以不实现)不写(注释掉),那么这句话写在这里就会出错,错误提示,没有写。那么就得用上面的方法【3】+【4】+【5】 [myTest printValue:10 andValue:20]; //[myTest release]; //用协议方式 id myProtocol=[[MyTest alloc] init]; if([myProtocol respondsToSelector:@selector(print:)]) { [myProtocol print:102]; } [myProtocol printValue:103 andValue:105]; // [myProtocol release]; } return 0;}