• 【iOS-界面传值方式的比较】


    前言

    • 暑期学习的过程中了解了iOS的五种传值方式,上次分享的时候有的不是很理解,这篇博客参考学习之后对iOS界面传值作揖做以对比和总结
    • 五大传值方式

    传值方式的比较

    • KVO传值的强调
      • KVO可以监听单个属性的变化,也可以监听集合对象的变化。通过KVO的mutableArrayValueForKey:等方法获得代理对象,当代理对象的内部对象发生改变时,会回调KVO监听的方法。集合对象包含NSArray和NSSet。
      • 如果用KVO传值想监听一个NSMutableArray对象的内部数量增减,并且可变数组的内部调整用到addObjects方法的时候,监听会失效,KVO只是监听setter方法
      • 在观察者不需要KVO的时候一定要移除监听!

    比较

    协议传值
    • 协议传值(代理)- 反向传值,单界面传值。
      • 好处
        • 逻辑清楚,在编译的时候编译器可以帮你辨别是不是实现了相应的代理方法,代码的可读性提高,思维清楚
        • 可以同时实现多个协议的代理传值,方便传不同的数据。在一个controller中可以定义多个协议,每个协议有不同的delegate,满足自定义开发需求,可选必选有较大的灵活性。
        • 所有能响应的事件必须在协议中有清晰的定义,一旦出现问题,那我们可以比较方便的定位错误代码。
      • 不方便的地方
        • 代码多,委托实现较繁琐,每个协议需要签订对应的代理,并且在传入和传出的界面分别实现方法,一旦漏掉就会发生错误
        • 一对一传值,一个delegate对象遵守一个协议
    通知传值
    • 通知传值依靠 通知中心Notification Center传值,可以跨越多个页面传值, 一般也是从后面的页面传给前面的页面。
      • 好处
        • 一对多,发送通知以后可以在多个界面接受通知,一个对象发出通知,根据需要多个对象接受通知,实现起来简单
        • -代码量少,发送通知-注册通知-接受通知
      • 不方便
        • 发出通知之后编译器不会识别,也就是发出了通知对方能不能收到编译器不能给我们反馈
        • dealloc释放注册的对象时候,需要在通知中心取消注册,否则将出现不可预见的崩溃
    KVO传值 key - Value - Observe
    • KVO传值一般适用于一个属性监听另一个属性的变化,KVO是一个对象能够观察另外一个对象的属性的值,并且能够发现值的变化。通知传值和协议传值适用一个controller与任何其他的对象进行通信,而KVO更加适合任何类型的对象侦听另外一个任意对象的改变 这里也可以是controller,但一般不是controller。这是一个对象与另外一个对象保持同步的一种方法,即当另外一种对象的状态发生改变时,观察对象 Observe马上作出反应。它只能用来对属性作出反应,而不会用来对方法或者动作作出反应。
    • 好处
      • 可以实现对某个属性变化的监听,用于观察属性的最新变化和先前变化,用KeyPath来观察属性
    • 不方便
      • 对属性重构将导致我们的观察代码不再可用,即观察者不会及时随着属性变化而变化
    Block传值
    • Block是对象,它封装了一段代码,这段代码可以在任何时候执行,block的调用实际就是函数的调用代理传值也是如此二者有相似之处,也是适用于反向传值
    • 好处
      • block也就是代码块,在很多调用中使用block都会使得代码的逻辑更加清晰。语法简洁,实现回调不需要显示的调用方法,代码更为紧凑。
    • 不方便
      • 当在Block中引用某个外部变量的时候,Block内部只会进行只读拷贝,这也就意味着,即便你在使用Block之前修改了那个外部变量的值,那么在你使用的Block里面它的值依旧是最开始的那个外部变量的值。如果想要同步外部变量的值,那么就需要在block内部引用变量时,在前面加上__block关键字。(使用__block,是将变量地址传给block,不使用则传递的是变量值给block)
    • 和代理传值相似,都是属于函数调用类型,但是BLock传值代码相对简洁,对于代理传值的委托来说BLOCk只需要在父界面创建子界面的时候获取子界面的值,相对简洁
  • 相关阅读:
    对话框管理器第三章:创建控件
    齐次坐标得到非齐次坐标
    encodeURI与encodeURIComponent的使用
    【原创】浅谈指针(十一)alloca函数
    C++类和对象【中】
    STM32测温枪
    unity属性之UnityEngine
    JUC常见的线程池源码学习 02 ( ThreadPoolExecutor 线程池 )
    解决huggingface 在代码因为网络无法下载模型和数据集的问题(伪)
    第一章-处理器体系结构
  • 原文地址:https://blog.csdn.net/weixin_61639290/article/details/126919372