前言:
项目开发中常常用到Protocol,Delegate及category ,初识时protocol与delegate 会傻傻分不清楚,其实他们非“基友”而是另有天地,且听我慢慢道来。
定义
协议,一个只有声明(可以声明方法当然也可以声明变量)的类。
- 任何类可以选择实现协议接口(其中@required 修饰下的方法必须实现);
- 协议允许两个继承关系的类可以相互通信实现一定目标;
- 协议分正式协议和非正式协议(即为分类Category)
正式协议
如果学过点java的同学会清除的知道,接口interface与协议有异曲同工之处。
Protocol 语法格式
@protocol SportProtocol <NSObject>
@optinal
- (void)playFootball;
- (void)playBasketball;
- (void)run;
@end
#import <Foundation/Foundation.h>
#import "SportProtocol.h"
@interface Person : NSObject<SportProtocol,NSObjectCopy>
@end
1.一个类可以遵循1个或多个协议(因为OC 中没有多继承,可以通过遵循多个协议实现,不过多个类可以共同实现同一个协议),同时父类遵守了某个协议,则子类自动遵守父类的协议。
此处就省略代码示例了…
2.protocol 只有声明,不同于category(分类)既有声明又有实现
Protocol
1.通常情况下Protocol不声明属性,即时声明了也不会生成相应成员变量
2.@required 和 @optional 关键字,前者表示声明的方法遵循协议者必须实现,后者则可选
组件化通信示例
说了这么多,贴出个简单的使用案例
//声明一个健康协议
#import <Foundation/Foundation.h>
@protocol HealthKitProtocol<NSObject>
+ (instancetype) sharedKit;
-(void)pushToHealthStepView:(UIViewController *)preVC;
-(void)registerStepKit;
@end
//建一个类来实现它
#import <Foundation/Foundation.h>
@interface HealthKit : NSObject<HealthKitProtocol>
+ (instancetype) sharedKit;
-(void)registerKit;
@end
#import "HealthKit.h"
@implementation HealthKit
+(instancetype)sharedKit
{
static dispatch_once_t onceToken;
static HealthKit *shareInstance;
dispatch_once(&onceToken,^{
shareInstance = [[HealthKit alloc]init];
});
return shareInstance;
}
-(void)registerKit
{
NSLog(@"I am a new steper");
}
@end
#import <Foundation/Foundation.h>
@HealthKitProtocol
@interface NewContext : NSObject
-(void)shareInstance;
- (void)setHealthKit:(id <HealthKitProtocol>)heathKit;
- (id <HealthKitProtocol>)getHelthKit;
@end
#import "NewContext.h"
@implementation NewContext
{
_ _weak id <HealthKitProtocol> _healthKit;
}
+(instancetype)sharedInstance
{
static dispatch_once_t onceToken;
static NewContext *shareInstance;
dispatch_once(&onceToken,^{
shareInstance = [[NewContext alloc]init];
});
return shareInstance;
}
//计步组件
- (void)setHealKit:(id <HealthKitProtocol>)healthKit
{
_healthKit=healthKit;
}
- (id <HealthKitProtocol>)getHealthKit
{
return _healthKit;
}
@end
//使用
-(void)initMain
{
//注册组件协议类
[[[NewContext shareInstance] setHealKit]:[HealthKit shareKit]];
//调用
[[NewContext shareInstance] getHealthKit] registerStepKit];
}
Protocol 和Delegate区别
1.delegate 叫代理或委托,是以协议的方式去实现,显示区别在于代理用 ;可以理解为有事自己不处理,委托别人来处理(自定义了一些方法,让别人去做)。
通常情况下委托的是:一 传值 二传事件
传值:常见的是 创建一个View 有个text文本,自定义一个按钮的点击事件,然后点击时把text文本内容传给view所在的controller 去做数据处理
传事件 :如 A类发生变化,告诉委托对象B类,B类对传过来的消息作出处理
委托赋值:即 A类声明带返回值的方法,B类实现并返回值给A类,A类作出相应的数据操作,从而也不用暴露自己的属性
2.Protocol 只是一个协议,只有方法声明没有实现,委托是通过protocol 声明一堆方法,并委托他类实现
实现场景:
的 UITableViewDataSource,UITableViewDelegate 两个协议是开发中最常见到的例子
UItablviewDatasource 通过告诉实现者一些参数,返回tableView想要的数据源
UITableViewDelegate 是委托实现者的一些操作事件
非正式协议
category 分类就是对一个类的功能进行扩展,让这个类能够适应不不同情况的需求. 在此不做详细分析有兴趣的可以去了解下。
摘录文章:
category
category底层本质
category优缺点
总结
在实际应用中,Protocol 应用相当频繁。我在项目中常用的场景大约有这么几类:
1.项目中常常是定义一个BaseProtocol 来定义一些通用的方法,然后其他类拓展。
2.在APPdelegate 常常要注册或者声明很多第三方及相关操作或者一些逻辑处理的事件可用Category拆分appdelgate;再者是工具类的拓展用到;最后为一些类声明私有方法或属性
3.作为Delegate 的载体,在委托模式中实现相应功能
以上是个人的浅知,不足之处请见谅,若有错处还请指正!