protocol协议的使用
创建文件,选择object c - protocol,只有.h文件
@protocol Myprotocol
{
-(void)test1;
@required//默认,要求实现,不实现会发出警告,方便协同交流(不同于java中接口不实现会报错)
-(void)test2;
@optional//不要求实现
-(void)test3;
}
协议关键字:required、optional
用来声明方法,类想要拥有这些方法,只需遵守这个协议
#import “MyProtocol.h”
//:继承<>遵守协议
@interface Person:NSObject <MyProtocol>
@end
在.m文件中实现方法
@implementation Person
-(void)test1
{
}
-(void)test2
{
}
@end
因此协议的基本用途
1、可以用来声明一大堆方法,不能声明成员变量
2、只要类遵守了这个协议,相当于拥有这个协议所有方法的声明
3、只要父类遵守了这个协议,相当于子类也遵守了
多个协议
继承只能有一个,oc是单继承,协议可以遵守多个
#import “MyProtocol1.h”
#import “MyProtocol1.h”
@interface Person:NSObject <MyProtocol1,MyProtocol2>
@end
基协议
协议遵守协议:一个协议遵守另一个协议,即可拥有另一个协议的所有方法声明
@protocol MyProtocol3 <MyProtocol1,MyProtocol2>
@end
NSObject是一个基协议,而基类NSObject遵守基协议,因此所有继承了NSObject也遵守基协议。任何协议要遵守基协议 。
变量遵守协议
NSObject<MyProtocol> *obj1 = [[Person alloc] init];//注意Person要遵守MyProtocol协议,否则会有警告
id<MyProtocol> obj2 = [[Person alloc] init];
@property (nonatomic, strong) id<MyProtocol> obj3;
@property (nonatomic, strong) Person<MyProtocol> obj4;
协议的提前声明
//.h文件中
//原#import "MyProtocol.h"改为
@protocol MyProtocol;
//.m文件中实际用到再导入
#import "MyProtocol.h"
也可以直接写在类头文件中,当协议只有当前类用时,协议写在里面,如下
@protocol MyProtocol<NSObject>
-(void)test;
@end
@interface Student:Person<MyProtocol>
@end
当协议多个类使用时,写单独文件,同理category也可写类中(大部分单独文件中)
代理(委托)设计模式
就是一个人让另一个人帮助他做某事
协议的定义
@protocol TicketDelegate <NSObject>
//票价
- (double) ticketPrice;
//剩了多少张票
- (int) leftTicketNumber;
@end
代理遵守协议并实现方法
@interface Agent : NSObject <TicketDelegate>
@end
@implementation Agent
- (double) ticketPrice
{
}
- (int) leftTicketNumber
{
}
@end
person类中_delegate这个对象代表着所使用的代理,当person需要换成另一个代理时会很麻烦,因此使用万能指针 id类型, 这样就可以不用每次都改变代码,但是这样使用id声明调用方法的时候系统不知道调用谁,这属于运行期的多态。在编译期无法识别代理类的方法,我们需要一个更灵活低耦合的模式即利用协议 ,当做一个 “用户”与 “代理”之间的中转站。
@interface Person : NSObject
- (void) buyTicket;
//拥有一个代理,必须遵守协议
@property (nonatomic,retain) id<TicketDelegate> delegate;
@end
@implementation Person
//想看电影
- (void) buyTicket
{
//让代理帮忙买票
double price = [_delegate ticketPrice];
int number = [_delegate leftTicketNumber];
NSLog(@"通过代理知:票价 = %f,剩余票数 = %d",price, number);
}
@end
分享到:
相关推荐
day16javaday16java
http的请求协议,响应协议。 servlet的创建方式,生命周期等
PPP(Point-to-Point Protocol点到点协议 RIP协议 1.矢量距离算法 2.RIP的原理 3.RIP报文的格式 4.RIP协议的运行 OSPF协议 1.概述 2.SPF算法 3.OSPF协议原理 3.1 自治系统的分区 3.2 区域间路由...
day16.rar
day16_springboot_笔记.docx day16_springboot_笔记.docx day16_springboot_笔记.docx day16_springboot_笔记.docx
包含V2X应用层ASN1一期与二期编码文件,用户可利用asn编解码工具生成源文件与头文件、消息集包括BSM/MAP/二期扩展消息
day16Selenium下.zip
day16常用模块.md
python爬虫python-Day16.rar
day16_网络编程
python100天的第16-30天,初学者友好
day16个人中心02.wmv
springboot学习笔记day16.xmind
day16_数据库基础.md
day16-Drink Water(喝水)
day16-Map、可变参数、Cloneable.pdf
C++day16-函数指针-模版 源码
黑马程序员_hibernate框架开发2016版讲义和笔记资料_day1_day2_day3_day4 包含4天的教学文档
Day2-1 RS232 RS485协议原理及应用
Day 16 :: Decoding QR Codes with AVFoundation Day 17 :: iBeacons Day 18 :: Detecting Facial Features with CoreImage Day 19 :: UITableView Row Height Estimation Day 20 :: View controller content and ...