美文网首页
iOS 代理和协议使用

iOS 代理和协议使用

作者: Nothing_xy | 来源:发表于2021-03-24 11:58 被阅读0次

使用

//必要要实现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,可以用这个方法来判断有没有实现某个方法

相关文章

  • IOS开发之协议和代理

    【iOS开发技术分享】协议与代理 【iOS开发技术分享】协议与代理 一、理解协议与代理 协议: 协议是一个方法签名...

  • MVC设计模式:1-代理(delegate)协议

    在iOS开发中,经常使用到代理(委托)协议以及数据源协议,所谓代理(委托)协议,通俗来讲,顾名思义就是委托别人办事...

  • 代理

    是iOS开发中一种普遍使用的设计模式代理组成:协议、代理方、委托方 协议 规定代理双方的行为 可以为方法列表,也可...

  • BLE Mesh代理协议

    什么是代理协议?代理协议的作用?代理协议的原理?代理协议的实现过程?为什么会有代理协议? 1、原理:为什么要使用代...

  • iOS代理模式的使用,委托(delegate)

    在iOS开发中代理是非常常见和普遍的,代理是一种通用的设计模式,iOS中对代理支持的很好,由代理对象、委托者、协议...

  • iOS 代理和协议使用

    使用 代理模式 代理模式官方定义为其他对象提供一种代理以控制对这个对象的访问。所谓代理,就是一个人或者一个机构代表...

  • Swift代理协议的安全使用

    文章 Swift代理协议的安全使用 概述 在Swift下,使用代理协议,并且检验代理对象的存在和协议函数是否被实现...

  • [学习笔记]_iOS代理基本使用,界面间传值

    参考链接: 你真的了解iOS代理设计模式吗? iOS开发-Protocol协议及委托代理(Delegate)传值 ...

  • 系列:iOS开发-协议和代理

    系列:iOS开发-协议和代理 既然说到了协议和代理,那么就有必要解释下意思.协议:协议是一个方法签名的列表,在这个...

  • iOS知识点总结(4)- 常见的设计模式

    1. iOS常见的设计模式? 1.代理模式 //创建代理协议 @protocol RYTestDelegate <...

网友评论

      本文标题:iOS 代理和协议使用

      本文链接:https://www.haomeiwen.com/subject/jafwpftx.html