美文网首页
代理和Block - 类之间相互传递的小纸条

代理和Block - 类之间相互传递的小纸条

作者: 枫泾西蹄 | 来源:发表于2016-09-01 17:19 被阅读46次

小知识:


    在iOS开发中,我们经常遇到的delegate,就是通常所说的代理(或者协议),通过借助于protocol来定义,这是iOS中一种消息传递的方式,也可以通过这种方式来传递一些参数。是一种通用的设计模式,iOS中对代理支持的很好,由代理对象、委托者、协议三部分组成。通俗一点讲代理的实现就好比一个婴儿并不会自己给自己洗澡,只有通过让妈妈或者保姆或者老师来给婴儿洗澡,这一过程就是代理的整个实现过程,这里的婴儿,妈妈,保姆还有老师都是一个类,而代理也就是类与类之间的沟通对话或者说是一种传递消息的方式。至于Block也都属于类之间传递消息的方式。

    但是,消息的传递也分种类,比如最常用的就是传值了,还有就是传对象,传方法,这里的传方法的意思就是,我不能做的事情交给你来做,可能需要你把做完事情的结果回传给我,也有可能是你做完了就是做完了,不用告诉我。

    与代理不同的是,Block比代理更加轻型,使用更简单,能够直接访问上下文,这样类中不需要存储临时数据,使用 Block 的代码通常会在同一个地方,这样读代码也连贯。但是Block使用的不恰当,会造成导致循环引用,内存无法释放。

Block的定义格式

返回值类型(^block变量名)(形参列表) = ^(形参列表) {

};

调用Block保存的代码

block变量名(实参);

     下面来说说Block的实现方法,Block通过将一段代码在运行中保存,用来封装和保存代码,有点像函数,Block可以在任何时候执行。也通俗点说就是将一个代码块放在堆区里,在引用的时候将这块代码的地址传过去,然后给参数,执行代码。

使用场景:


     在较多情况下,优先考虑使用Block,而有两个情况可以考虑 delegate :

1.有多个相关方法。假如每个方法都设置一个 block, 这样会更麻烦。而 delegate 让多个方法分成一组,只需要设置一次,就可以多次回调。当多于 3 个方法时就应该优先采用 delegate。

   比如一个网络类,假如只有成功和失败两种情况,每个方法可以设计成单独 block。但假如存在多个方法,比如有成功、失败、缓存、https 验证,网络进度等等,这种情况下,delegate 就要比 block 要好。

   在 swift 中,利用 enum,  多个方法也可以合并成一个 block 接口。swift 中的枚举根据情况不同,可以关联不同数据类型。而在 objc 就不建议这样做,objc 这种情况下,额外数据需要使用 NSObject 或者 字典进行强转,接口就不够安全。

2.为了避免循环引用,也可以使用 delegate。使用 block 时稍微不注意就形成循环引用,导致对象释放不了。这种循环引用,一旦出现就比较难检查出来。而 delegate 的方法是分离开的,并不会引用上下文,因此会更安全些。

   假如写一个库供他人使用,不清楚使用者的水平如何。这时为防止误用,宁愿麻烦一些,笨一些,使用 delegate 来替代 block。


总结:


     就好比高中时期那些年传过的小纸条一样,类与类之间需要头痛,对象与对象之间也需要沟通,因为沟通才能将一件事情做好,而代理和Block就是沟通中最常用的方式或者说工具,而活用这些工具才会使沟通变的有效率,最后以上都是个人的一些胡说八道,有什么错的地方欢迎打脸指正,请给我一个改过自我的机会。

相关文章

  • 代理和Block - 类之间相互传递的小纸条

    小知识: 在iOS开发中,我们经常遇到的delegate,就是通常所说的代理(或者协议),通过借助于proto...

  • iOS深入传值

    传统的代理和block传值一般都是单层传递,想要深入的传递值,一般做法就是通过通知跨类传递。代理、block要想深...

  • block的内存管理与多线程

    1、block 的概述: 我们知道,block 主要用于实现的代理的一些功能,用于两个类之间值的传递,以及实现链式...

  • 代理、Block、通知、KVO

    1.代理代理是:。 2.Blockdelegate和block的作用都是用于两个类之间的回传数据,即当一个类创建了...

  • React-Native 与原生代码之间的事件传递

    熟悉 iOS 的同学都知道,controller 之间的事件传递有多种: 代理 block 通知 KVO 那么 R...

  • VC之间的数据传递方式小结

    VC之间的数据传递方式大体有6种 设置VC的属性 设置代理delegate block 通知notificatio...

  • iOS (反向)传值

    代理、block、消息中心、单例。 正向传值 通过属性(特性)的值,在上个使用本类(所在类)对象的类中,直接传递其...

  • iOS常用设计模式

    代理模式:完成委托方的任务,需要声明代理对象和指定代理,相对于block,在需要传递参数的传值时优先考虑代理。代理...

  • 20210114今日小确幸

    1、网购棉衣收到意外惊喜,好评返现的小纸条上传递商家的问候,在风刀霜剑严相逼的寒冷冬季,多了一丝人与人之间相互关爱...

  • iOS block的使用

    前言: block是iOS开发中时间及参数传递的一种方法,和代理模式(delegate)相比,block是简单易用...

网友评论

      本文标题:代理和Block - 类之间相互传递的小纸条

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