协议的作用与Java中接口的作用非常类似,用于定义类应该遵守的规范,协议不提供实现,只定义规范。协议中定义多个类的公共行为规范,协议通常定义一组公用方法,方法的实现交给
@end
协议支持多继承,可以看到上面的语法格式,多个父协议放在<>中,子协议继承父协议会得到父协议的所有方法。 协议的方法需要类去实现,如果类没有实现则会发出警告,但是我们有时定义的协议方法,类并不一定要去实现,OC为我们想到了这一点,通过@optional和@required两个关键词就可以做到。 @required:默认行为,实现类必须实现这些方法,如果没有实现,编译器会提示警告。 @optional:实现类可以实现这些方法,也可以不实现。
@protocol 协议名 <父协议1,父协议2...> //协议方法 @optional //可选的协议方法 //... @required //必须实现的协议方法 //... @end
实现协议:在类接口定义时需要指明继承的父类,在后面可以指定要实现的协议,实现协议的格式如下: @interface 类名 : 父类 <协议1,协议2...>
@end
下面看一个例子 定义一个协议(PrintProtocol.h) [objc] view plain copy
- <span style="font-size:18px;">#import <Foundation/Foundation.h>
- @protocol PrintProtocol
- //协议方法
- @optional
- -(void)printName;
- @required
- -(void)printMessage;
- @end
- </span>
定义一个Student类 实现协议PrintProtocol
[objc] view plain copy
- <span style="font-size:18px;">#import <Foundation/Foundation.h>
- #import "PrintProtocol.h"
- @interface Student : NSObject <PrintProtocol>
- @property (nonatomic,copy)NSString* name;
- @property (nonatomic,assign)int age;
- @end
- #import "Student.h"
- @implementation Student
- -(void)printName{
- NSLog(@"我的名字是:%@",_name);
- }
- -(void)printMessage{
- NSLog(@"姓名:%@,年龄%d",_name,_age);
- }
- @end</span>
OC中的协议也可以想Java接口一样定义变量,定义变量的可以有以下2种语法: NSObject<协议1,协议2...>* 变量; id<协议1,协议2...> 变量;
下面我们测试协议的使用: [objc] view plain copy
- <span style="font-size:18px;">#import <Foundation/Foundation.h>
- #import "Student.h"
- int main(int argc, const charchar * argv[]) {
- @autoreleasepool {
- Student* stu = [[Student alloc]init];
- [stu setName:@"小明"];
- [stu setAge:10];
- //调用实现的协议的方法
- [stu printName];
- [stu printMessage];
- //使用NSObject的方式创建一个协议对象
- NSObject<PrintProtocol>* op = stu;
- //使用协议对象调用协议方法
- [op printMessage];
- //使用id的方式创建一个协议对象
- id<PrintProtocol> ip = stu;
- //使用协议对象调用协议方法
- [ip printMessage];
- }
- }</span>
输出结果: 我的名字是:小明 姓名:小明,年龄10 姓名:小明,年龄10 姓名:小明,年龄10