OC 协议(protocol)
2018-02-08 17:03
375 查看
协议的作用与Java中接口的作用非常类似,用于定义类应该遵守的规范,协议不提供实现,只定义规范。协议中定义多个类的公共行为规范,协议通常定义一组公用方法,方法的实现交给类去完成。协议的基本语法格式如下:@protocol 协议名 <父协议1,父协议2...>//协议方法
@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
@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
相关文章推荐
- 关情纸尾-----OC-protocol协议的基本知识
- 黑马程序员---OC基础---Block、分类Category、协议protocol
- oc 中协议 protocol 的使用
- OC 类目(category) 延展(extension) 协议(protocol)
- 黑马程序员——OC学习之协议protocol的使用
- OC中的类别Category-协议Protocol-扩展Extension
- OC学习之协议(protocol)浅析
- OC_Protocol(协议)
- 学习笔记:OC的protocol协议及代理设计模式
- 黑马程序员_iOS开发之OC之block块与@protocol协议
- OC_protocol协议介绍(2)
- OC - 第七章 类的扩展: 类目Category, 延展Extension, 协议Protocol ( 二 )
- 第十五篇:OC中 分类,关键字protocol 协议的声明与应用
- 【IOS 开发学习总结-OC-20】★★★objective-c面向对象——协议(protocol)
- OC中的类别Category-协议Protocol-…
- 17、OC 协议(protocol)
- OC_语法入门_day6_ARC(循环引用)/block代码块(闭包)/protocol协议(接口)/代理模式
- 15、黑马程序员-OC Protocol(协议)
- OC--Protocol 协议
- OC--protocol 协议