通知,delegate,block 的区别

各种回调机制的比较:

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 的区别)