使用
//必要要实现NSObject协议
@protocol BreakerDelegate <NSObject>
//必须要实现的方法
@required
- (void)gatewayStatusWithDic:(NSDictionary *)dic;
- (void)breakerStatusWithDic:(NSDictionary *)dic;
- (void)subscribeStatusWithDic:(NSDictionary *)dic;
- (void)unSubscribeStatusWithDic:(NSDictionary *)dic;
@optional//可选的方法
@end
//编写代理
@property(weak, nonatomic)id<BreakerDelegate> delegate;
//实现代理
@interface ViewController ()<BreakerDelegate>
//设置代理
[Breaker sharedInstance].delegate = self;
//respondsToSelector,可以用这个方法来判断有没有实现某个方法
代理模式
- 代理模式官方定义
- 为其他对象提供一种代理以控制对这个对象的访问。所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
- 为什么使用代理模式?
- A 完成一件事,但是自己不能完成,或是自己完成这件事情要花费非常大的精力,于是他找个代理人 B 替他完成这个事情,他们之间便有个协议 (protocol),B 继承该协议来完成 A 代理给他的事情。
相关面试题
- 代理为啥要用weak修饰?
- weak:指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制
- strong:该对象强引用delegate,外界不能销毁delegate对象,会导致循环引用(Retain Cycles)
- 代理、block、通知三者的区别
- 使用方便程度
- 使用特点
- 代理和block都是一对一
- 通知可以一对多,多个add,一个post
- 使用场景
- block功能不复杂的需求,优先使用代理,动画,数据请求回调,枚举回调
四:多线程gcd
- 功能较复杂,回调函数很多,回调的很频繁,次数很多,像UITableview,每次初始化、滑动、点击都会回调,使用代理
- 通知,非常轻量,功能简单时使用
- 优点对比
- block
- 1.代码可读性好
- 2.使用方便,轻量级,效率高,
- 3.使用场景多,可以当一个成员变量、属性、参数使用,使用起来非常灵活
- 代理
- 1.耦合低
- 2.运行成本
- 一对一,而且逻辑结构非常清晰
- 通知
- 缺点对比
- block
- 1.运行成本高,block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是引用计数加1,使用完或者block置nil后才销毁
- 2.容易造成循环引用
- 3.耦合高
- 4.不能跨对象传递(A->B,B-C)
- 代理
- 1.使用麻烦(相对block来说)
- 2.不能跨对象传递(A->B,B-C)
- 通知
- 1.不易追踪
- 2.已发生,泄漏(在delloc中移除通知)
代理反向传值
//必要要实现NSObject协议
@protocol BreakerDelegate <NSObject>
//必须要实现的方法
@required
- (void)setValue:(NSString *)string;
@optional//可选的方法
@end
//编写代理
@property(weak, nonatomic)id<BreakerDelegate> delegate;
//判断代理中的方法是否被实现,避免未被实现代理的程序崩溃
if ([self.delegate respondsToSelector:@selector(setValue:)])
{
[self.delegate setValue:@"123"];
}
//实现代理
@interface ViewController ()<BreakerDelegate>
//设置代理
[Breaker sharedInstance].delegate = self;
//实现委托方法,即实现的setValue方法
- (void)setValue:(NSString *)string
{
NSLog(@"A接收到B数据%@",string);
}
//respondsToSelector,可以用这个方法来判断有没有实现某个方法
网友评论