共同点
Block 和 Delegate中的方法都可以理解成回调函数,当某件事情发生的时候取执行一段代码片段
block
block 更轻型,使用更简单,能够直接访问上下文,这样类中不需要存储临时数据。
使用 block 的代码通常会在同一个地方,这样读代码也连贯。
另:block外部使用__week修饰会防止循环引用
但是在block里面在强引用一下是为了防止变量提前释放(例如block里面有延迟调用的方法)
delegate
delegate 更重一些,需要实现接口,它的方法分离开来,很多时候需要存储一些临时数据。
另外相关的代码会被分离到各处,没有 block 好读。
代理的回调函数可以是一组多个函数,不同情况下调用不同的函数
推荐优先使用block
推荐使用delegate情况
1、多个方法。设置一次,回调多个方法,比如tableview和textview的delegate
2、避免循环引用,delegate不会造成循环引用,但是block很容易造成循环引用,相比较更加安全
3、需要对不同状态下的情况进行处理,比如UIScrollView的开始滚动、将要滚动、滚动结束等
block有三种情形
1、临时性的,比如数组的遍历,不会存储
2,一次性的,比如UIView animation...只会调用一次
3,自己声明的,比如按钮事件block,这是多次调用的,会存储下来(很容易造成循环引用)