protocol(协议)、delegate(代理)

protocol(协议)、delegate(代理)

一、protocol(协议)

1.概念:把多个类中的某些共同属性、方法抽象到一个类中,但这些属性、方法在不同的类中有不同的实现,相当于Java中的接口。协议只有声明,没有实现。使用者只需要遵守这个协议 ,就可以得到这个协议里面声明的方法

 

2.创建一个协议

如Test.h

#import <Foundation/Foundation.h>

@protocol Test <NSObject>

- (void)test;//默认就是required

@required//下面的方法必须实现
- (void)loadData;
- (NSString *)outPutData;

@optional//可以选择是否实现
- (void)doSomething;

@end

 

 

2.实现协议里面的方法

<协议1,协议2>

如创建一个ClassA类:

ClassA.h

 

#import <Foundation/Foundation.h>
#import "Test.h"

@interface ClassA : NSObject <Test>

@end

 

ClassA.m

#import "ClassA.h"

@implementation ClassA

- (void)loadData{
  NSLog(@"ClassA 加载数据");
}

- (NSString *)outPutData{
  return @"ClassA 输出数据";
}

-(void)test{
}

@end

main.m

#import <Foundation/Foundation.h>
#import "ClassA.h"

int main(int argc, const char *char *argv[]){
  @autoreleasepool{
    ClassA *a = [ClassA new];
    
    [a loadData];
    [a outPutData];

    //判断是否实现了可选方法,SEL类似于函数指针
    if ([a responsToSelector:@selector(doSomething]){
      [a doSomething];

    }
  }
}

 

二、delegate(代理)

1.概念:delegate(代理)是OC中的一种模式,可以用来传递值和配置值(这里我们只讨论传值的过程)。设想有两个界面,其中一个界面要改变另一个界面的数据,这里我们就会用到代理模式,将改变数据的那个界面作为被改变界面的代理,通过代理来返回给后者被改变的数据。

2.一个具体例子:假设我(Person)要租房,需要找到一个中介(Agent),中介通过方法找到房子,并通知我,我接收到消息返回给中介。又来一个老板(Boss)租房,中介找到房通知秘书(Secretary)。如果使用普通模式,则要在Agent类中创建3个对象,而且还要在各自的类中定义不同的接收到消息的方法(每个人接收消息的方法可能不一样),就会形成代码的冗余。如果定义一个协议(Protocol), 统一接收信息的方法,就会将问题简单化

Agent.h

 

#import <Foundation/Foundation.h>

//声明一个协议,如果想使用我,就必须遵守这个协议
@protocol RentHouseDelegate <NSObject>
//接收到信息返回的方法
- (void)rentHouseDidFinished:(NSString *)result;
@end

@interface Agent : NSObject
//可以创建任意对象,但对象必须遵守协议
@property (nonatomic, assign) id<RentHouseDelegate> delegate;

//功能类本身的方法
- (void)rentHouse;

@end

 Agent.m

#import "Agent.h"

@implementation Agent

- (void)rentHouse{
  //判断是否实现了这个方法
  if([self.delegate respondsToSelector:@selector(rentHouseDidFinished:)]){

    [self.delegate rentHouseDidFinished
:@"避风港"];//尽量都用self.调用本身属性,有利于内存管理
  }
}
@end

Person.h

#import <Foundation/Foundation.h>
#import "Agent.h"

@interface Person : NSObject<RentHouseDelegate>

- (void)needHouse;

@end

Person.m

#import  "Person.h"

@implementation Person

 
    

-(void)needHouse{

 
    

    //找到中介

    Agent *xw = [Agent new];

 
    

    //告诉中介我是谁

    xw.delegate = self;

 
    

    //中介做事

    [xw rentHouse];

}

 
    

- (void)rentHouseDidFinished:(NSString *)result {

    NSLog(@"%@", result);

} 

 
    

@end

 Secretary.h

#import <Foundation/Foundation.h>
#include "Agent.h"

@interface Secretary : NSObject<RentHouseDelegate>

-(void)bossNeedHouse;

@end

Secretary.m

#import "Secretary.h"

@implementation Secretary
-(void)bossNeedHouse{
    //找到中介
    Agent *xw = [Agent new];
    //告诉中介我是谁
    xw.delegate = self;
    //中介开始租房
    [xw rentHouse];
}

-(void)rentHouseDidFinished:(NSString *)result{
    NSLog(@"%@", result);
}
@end

Boss.h

#import <Foundation/Foundation.h>


@interface Boss : NSObject

- (void)needHouse;

@end

Boss.m

#import "Boss.h"
#import "Secretary.h"

@implementation Boss
-(void)needHouse{
    //找到秘书
    Secretary *xl = [Secretary new];
    //告诉秘书要租房
    [xl bossNeedHouse];
}

@end

 

注意:在实际开发过程中,传递值一般用block或者消息

 

posted @ 2018-07-30 11:00 健泽 阅读( ...) 评论( ...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值