Objective-c协议

来源:互联网 发布:粤语学软件哪个好 编辑:程序博客网 时间:2024/06/05 10:01

协议的概述

当定义类时,经常需要一些方法来描述类的行为,有时候这些方法需要被多个类所使用,具体在不同类中实现的方法也无法确定,这时便可以使用协议。着类似于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

如果不想在公开的.h文件中声明协议,可以直接在m文件中声明(类似于分类或者类扩展)
#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


这时,如果需要另一个或者更多助手,只需要让助手遵循协议就可以。这样不仅可以实现程序本身功能,还可以减小耦合度,提高效率



0 0
原创粉丝点击