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或者消息