iOS 代理和协议使用

使用

//必要要实现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
      • 代理
    • 使用特点
      • 代理和block都是一对一
      • 通知可以一对多,多个add,一个post
    • 使用场景
      • block功能不复杂的需求,优先使用代理,动画,数据请求回调,枚举回调
        四:多线程gcd
      • 功能较复杂,回调函数很多,回调的很频繁,次数很多,像UITableview,每次初始化、滑动、点击都会回调,使用代理
      • 通知,非常轻量,功能简单时使用
    • 优点对比
      • block
        • 1.代码可读性好
        • 2.使用方便,轻量级,效率高,
        • 3.使用场景多,可以当一个成员变量、属性、参数使用,使用起来非常灵活
      • 代理
        • 1.耦合低
        • 2.运行成本
        • 一对一,而且逻辑结构非常清晰
      • 通知
        • 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,可以用这个方法来判断有没有实现某个方法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容