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