Objective-c协议

协议的概述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值