各种回调机制的比较:
1)代理:也叫委托,当某个对象收到多个事件,并要求同一个对象来处理所有事件时。委托机制依赖于某个协议定义的方法来发送消息。
代理主要是提供接口、或是类似C++多重继承功能,为类提供一种修饰机制。代理不是为回调而生的,它应该表述一组互操作约定。
优点:
实现简单,容易理解。
强类型检查。
缺点:
类与类间建立了比较强的耦合关系
有可能需要较长期保存委托以进行回调。如果保留的委托需要有独占性,可能会给单件模式、以及多线程带来麻烦。
类只能通过一个方法完成一种类型的回调。代码逻辑很容易集中到一个方法中。
大部分回调使用实际无需通过协议暴露给外部。
2)通告机制:当需要多个对象或两个无关对象处理同一个事件时。
NSNotificationCenter是OBJC提供的消息机制。它有些类似于观察者模式,通过关注感兴趣的消息,建立回调。NSNotificationCenter提供了一种低耦合的对象通讯机制,特别适合无指定对象的一对多回调。
优点:
回调对象间耦合度低。相互之间可不必知道对方存在。
通过消息传递的信息无限制。
观察者可选择特定消息、特定对象,或者特定对象的特定消息进行观察。
缺点:
缺乏时序性。当事件发生时,回调执行的先后次序不确定。也不能等待回调完成执行后续操作。解决:1)使用传统回调机制。2)多线程时,可使用NSCondition同步线程。3)使用更多的消息。(过多使用可能导致混乱)
3)Block:适用于回调只发生一次的简单任务。
注意:
1)block对象使用的变量、参数在运行时被绑定,因此可以直接使用栈空间建立的变量,无需参数传入。但block对象的创建依然有生命周期限制,因此传入异步调用的block对象时,如果是栈空间创建的block,必须
使用Block_copy()将block拷出备份,然后使用Block_release()将block释放。参见Using Blocks章,Patterns to Avoid节
2)对于在栈空间声明的变量,绑定到block时被标记为const。只能读取不能写入。如果需要写入,需要用__block对变量进行标记。此时block使用的是从栈拷贝到堆中的对象。当出block时,如果栈可用则将堆中对象自动拷贝回栈。
优点:
最轻量级的回调机制。
编译器类型检查。
如函数指针一样,灵活定义回调函数。
缺点:
执行效率。(影响程度不清楚)
容易导致代码逻辑集中。
网友评论