美文网首页
通知,delegate,block 的区别

通知,delegate,block 的区别

作者: dxin_101 | 来源:发表于2018-05-16 08:31 被阅读0次

    各种回调机制的比较:

    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时,如果栈可用则将堆中对象自动拷贝回栈。

    优点:

    最轻量级的回调机制。

    编译器类型检查。

    如函数指针一样,灵活定义回调函数。

    缺点:

    执行效率。(影响程度不清楚)

    容易导致代码逻辑集中。

    相关文章

      网友评论

          本文标题:通知,delegate,block 的区别

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