协议的概述
当定义类时,经常需要一些方法来描述类的行为,有时候这些方法需要被多个类所使用,具体在不同类中实现的方法也无法确定,这时便可以使用协议。着类似于c++的多重继承和java的接口,协议是最常见的代理模式。
协议是一系列方法的声明列表,只要某个类遵守这个协议,就可以使用协议中的方法。语法格式如下
@protocol 协议名称
方法声明
@end
示例:
#import <Foundation/Foundation.h>
@protocol Myprotocol <NSObject>
-(void)eat;
-(void)run;
@end
协议的创建方法与分类类似,只需要在file type选项选择protocol
协议的使用
@required和@optional
@required:这个关键字标记的方法必须要实现,否则编译器会发出警告但是不影响编译,它是默认的
@optional:可以不实现
#import <Foundation/Foundation.h>
@protocol Myprotocol <NSObject>
-(void)eat;
@optional //表示run方法可以不实现
-(void)run;
@end
使用协议
//.h
#import <Foundation/Foundation.h>
#import "Myprotocol.h"
@interface Person : NSObject<Myprotocol>
@end
//.m
#import "Person.h"
@implementation Person
-(void)eat
{
//其中实现功能代码
}
-(void)run
{
}
@end
#import "Person.h"
@interface Person() <Myprotocol>
@end
@implementation Person
-(void)eat
{
}
-(void)run
{
}
@end
一个协议可以遵循其他协议(一个或多个)。就能拥有其他协议的方法
@protocol Myprotocol <FristProtocol,LastProtocol>
@end
代理
oc中,代理模式是一种常见的设计模式。代理就是某些自己不能亲自完成的事情,让他人帮忙完成。例如:老板需要出差,但是没时间购买机票,就让助手帮忙购买机票:
#import <Foundation/Foundation.h>
//声明助手类,帮助老板查询余票和价格
@interface Assistant : NSObject
-(int)selectTicketNumber;
-(int)selectTicketPrice;
@end
--------------------------
#import "Assistant.h"
@implementation Assistant
-(int)selectTicketNumber
{
return 100;
}
-(int)selectTicketPrice
{
return 900;
}
@end
#import <Foundation/Foundation.h>
@class Assistant;
@interface Boss : NSObject
//买机票的方法
-(void)payTicket;
//声明一个叫张三的助手
@property (nonatomic,strong)Assistant *zhangSan;
@end
------------------
#import "Boss.h"
#import "Assistant.h"
@implementation Boss
-(void)payTicket
{
int num = [_zhangSan selectTicketNumber];
int price =[_zhangSan selectTicketPrice];
NSLog(@"余票还有%d张,票价%d",num,price);
}
@end
#import <Foundation/Foundation.h>
#import "Boss.h"
#import "Assistant.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Boss *b = [[Boss alloc]init];
Assistant *zhangSan =[[Assistant alloc]init];
b.zhangSan = zhangSan;
b.payTicket;
}
return 0;
}
输出结果:
余票还有
100
张
,
票价
900
如果不在使用张三做代理,而使用其他人,就需要创建其他人的类,比较麻烦,由此可以使用代理来改进:
#import <Foundation/Foundation.h>
@class Assistant;
#import "TicketProtocol.h"
@interface Boss : NSObject
//买机票的方法
-(void)payTicket;
//声明一个遵循TicketProtocol的助手对象
@property (nonatomic,weak)id<TicketProtocol> delegate;
@end
#import <Foundation/Foundation.h>
@protocol TicketProtocol <NSObject>
-(int)selectTicketNumber;
-(int)selectTicketPrice;
@end