17、OC 协议(protocol)
2014-12-09 17:10
211 查看
协议的作用与Java中接口的作用非常类似,用于定义类应该遵守的规范,协议不提供实现,只定义规范。协议中定义多个类的公共行为规范,协议通常定义一组公用方法,方法的实现交给类去完成。
协议的基本语法格式如下:
@protocol 协议名 <父协议1,父协议2...>
//协议方法
@end
协议支持多继承,可以看到上面的语法格式,多个父协议放在<>中,子协议继承父协议会得到父协议的所有方法。
协议的方法需要类去实现,如果类没有实现则会发出警告,但是我们有时定义的协议方法,类并不一定要去实现,OC为我们想到了这一点,通过@optional和@required两个关键词就可以做到。
@required:默认行为,实现类必须实现这些方法,如果没有实现,编译器会提示警告。
@optional:实现类可以实现这些方法,也可以不实现。
@protocol 协议名 <父协议1,父协议2...>
//协议方法
@optional
//可选的协议方法
//...
@required
//必须实现的协议方法
//...
@end
实现协议:在类接口定义时需要指明继承的父类,在后面可以指定要实现的协议,实现协议的格式如下:
@interface 类名 :
父类 <协议1,协议2...>
@end
下面看一个例子
定义一个协议(PrintProtocol.h)
定义一个Student类 实现协议PrintProtocol
OC中的协议也可以想Java接口一样定义变量,定义变量的可以有以下2种语法:
NSObject<协议1,协议2...>* 变量;
id<协议1,协议2...> 变量;
下面我们测试协议的使用:
输出结果:
我的名字是:小明
姓名:小明,年龄10
姓名:小明,年龄10
[b]姓名:小明,年龄10[/b]
协议的基本语法格式如下:
@protocol 协议名 <父协议1,父协议2...>
//协议方法
@end
协议支持多继承,可以看到上面的语法格式,多个父协议放在<>中,子协议继承父协议会得到父协议的所有方法。
协议的方法需要类去实现,如果类没有实现则会发出警告,但是我们有时定义的协议方法,类并不一定要去实现,OC为我们想到了这一点,通过@optional和@required两个关键词就可以做到。
@required:默认行为,实现类必须实现这些方法,如果没有实现,编译器会提示警告。
@optional:实现类可以实现这些方法,也可以不实现。
@protocol 协议名 <父协议1,父协议2...>
//协议方法
@optional
//可选的协议方法
//...
@required
//必须实现的协议方法
//...
@end
实现协议:在类接口定义时需要指明继承的父类,在后面可以指定要实现的协议,实现协议的格式如下:
@interface 类名 :
父类 <协议1,协议2...>
@end
下面看一个例子
定义一个协议(PrintProtocol.h)
<span style="font-size:18px;">#import <Foundation/Foundation.h> @protocol PrintProtocol //协议方法 @optional -(void)printName; @required -(void)printMessage; @end </span>
定义一个Student类 实现协议PrintProtocol
<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...> 变量;
下面我们测试协议的使用:
<span style="font-size:18px;">#import <Foundation/Foundation.h> #import "Student.h" int main(int argc, const char * 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
[b]姓名:小明,年龄10[/b]
相关文章推荐
- OC之Cagegory, Extension, Protocol协议
- 【IOS 开发学习总结-OC-20】★★★objective-c面向对象——协议(protocol)
- OC--———协议protocol的基本使用
- OC @protocol(声明协议 )
- OC中protocol协议
- OC语言的Block与Protocol(协议)
- OC--protocol 协议
- OC中的协议(@protocol)
- OC基础—protocol协议
- OC之【@protocol协议】
- 黑马程序员--OC--Protocol(协议)
- OC_Protocol(协议)
- OC_protocol协议介绍(1)
- 黑马程序员——OC基础---protocol(协议)
- 黑马程序员——OC学习之协议protocol的使用
- 【Objective-C】OC中协议(Protocol)的基本概念和用法
- OC中的类别Category-协议Protocol-…
- OC协议protocol详解
- OC之【@protocol协议】
- 15、黑马程序员-OC Protocol(协议)