先理解下方法的过程:
1、声明方法
2、实现方法
3、调用方法
每个方法都需要经过这三步,才能在系统中执行等
对于Block实际作用:1.作为成员变量进行声明 (通常代替Delegate使用,需要触发操作) 2.作为方法使用(通常需要用到A中数值时使用,不需要特殊触发,直接调用即可)
Demo:https://github.com/735850697/block
声明成员变量和方法
在方法的声明和实现:
函数正常参数和block函数参数理解【不管是什么只要是函数都是要触发才能执行的,block函数也是函数】
在这个过程:正常参数是直接使用的(用),Block是来获值的(取)
自定义函数:如果参数是正常的参数,调用此函数是会直接使用正常参数执行,如果是以block函数作为参数时【此时作用恰恰相反:他是来获取值的,而不是提供值的了】,此时他并不是这个函数的真正的参数了,而是在来这个函数获取值触发回调的。
在调用方法中:
在这个过程:正常参数是我们赋值的(取),Block是来给值的(用)
我们在调用方法时,正常参数是我们需要来赋值执行的,而Block是在方法实现过程中毁掉过来的值,是给我们直接使用的。
上代码:
Block能解决我们什么问题:
一切和回调有关的事情都可以用Block来解决
名称优点缺点
Notification1.使用简单,代码精简。2.解决了同时向多个对象监听相应的问题。3.传值方便快捷,Context自身携带相应的内容。1.使用完毕后,要时刻记得注销通知,否则将出现不可预见的crash。2.key不够安全,编译器不会监测是否被通知中心正确处理。3.调试的时候动作的跟踪将很难进行。4.当使用者向通知中心发送通知的时候,并不能获得任何反馈信息。5.需要一个第三方的对象来做监听者与被监听者的中介。
Delegate1.减少代码的耦合性,使事件监听和事件处理相分离。2.清晰的语法定义,减少维护成本,较强的代码可读性。3.不需要创建第三方来监听事件和传输数据。1.实现委托的代码过程比较繁琐。2.当实现跨层传值监听的时候将加大代码的耦合性,并且程序的层次结构将变的混乱。3.当对多个对象同时传值响应的时候,委托的易用性将大大降低。
Block1.语法简洁,实现回调不需要显示的调用方法,代码更为紧凑。2.增强代码的可读性和可维护性。3.配合GCD优秀的解决多线程问题。1.Block中得代码将自动进行一次retain操作,容易造成内存泄露2.Block内默认引用为强引用,容易造成循环引用。
使用原则
如果方法过多,一般大于3个的时候,用delegate,因为此时用block,代码将很难维护。比如UITableViewDelegate等等UI组建,都是用的delegate。其他方式用block。
Notification能不用的时候尽量不用,缺点太多明显,增加调试难度。在工程大的情况下,极其难以维护。当然有些情况下也是必不可少的,比如观察者模式.