小知识:
在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就是沟通中最常用的方式或者说工具,而活用这些工具才会使沟通变的有效率,最后以上都是个人的一些胡说八道,有什么错的地方欢迎打脸指正,请给我一个改过自我的机会。