NSNotification和Delegate使用及心得

首先,请确保以阅读: <delegate代理(委托)的使用心得> 和 <消息通知机制NSNotification>

正如我们大家都知道的,IOS中经常会提到NSNotification和delegate来进行一些类之间的消息传递。其实在我刚开始学OC的时候,很久不能理解这个消息传递有什么用.慢慢的当熟悉了MVC,以及封装思想以后,发现这2个消息传递真的时神器,但是他们之间有什么区别呢?

NSNotification就是IOS提供的一个消息中心,由一个全局的defaultNotification管理应用中的消息机制。通过公开的API可以看出,这里面使用了是一个观察者,通过注册addObserver和解除注册removeObserver来实现消息传递。苹果文档特别提出,在类析构的时候,要记得把removeObserver,不然就会引发崩溃,所以NSNotifcation的使用是没有retain+1的,NSNotification是一对多的。

至于Delegate,很简单,就是通过增加一个指针,然后把需要调用的函数通过delegate传递到其他类中,来得很直截了当。不需要通过广播的形式去实现,但是,delegate的形式只能是一对一,不能实现一对多。

在什么情况下使用Delegate和NSNotifiation呢。从效率上看Delegate是一个很轻量级的,相对delegate,NSNotification却是一个很重量级的,效率上delegate明显要比Noticication低。一般情况我们会这样使用。

场景一:

A拥有B,然后B中的一些操作需要回调到A中,这时候就简单的通过delegate回调到A。因为B是A创建的,B可以很直接的把delegate赋值A。

场景二:

A和B是两个不相干的关系,A不知道B,B也不知道A,那么这时候如果通过delegate就没办法做到,会相对复杂。所以可以通过NSNotifcation去做一些消息传递。

所以使用delegate的情况是两者有直接的关系,至于一方知道另一方的存在。而NSNotifcation一般是大家不知道对方的存在,一般是使用跨模块的时候使用。在使用的时候,使用delegate可能需要多写一些delegate去实现,代码量比较多。NSNotication只要定义相关的NotificationName就可以很方便的沟通。两者各有所长。

我们可以举一个这样不是特别恰当的例子,假设一个工程是一个小区,而每个类是小区的住户.Delegate就像是打电话,而NSNotification像是进行一次小区的广播.

广播可以做到打电话的所有事情,但是没一次广播会牵涉到其他不需要通知的住户,虽然他们不理会.(但是你小区24小时广播,内容都和你没关系,当发送一条和你有关系的内容,你会注意到吗?这就一部分的影响了程序的性能)

打电话一定程序也可以广播的事情,当你知道另外一个住户的电话号码才可以进行通话(这里知道对话电话号码可能和实际代理的使用有点小区别,仅仅举这个例子),但是还有一种情况是你不知道对方的电话号码.

情节:1.比如你想去通知你的女朋友(有电话号码)去吃饭,你不可能去发一个广播说”xxx,走去吃饭了”. 2.比如你的小孩(并且没有电话号码)丢了,这个时候你可能只有通过一则广告”xxx小朋友,请到哪里,xx正在找你”.(当然你也有一个极端的做法,给你所有认识的打一个电话”xx小朋友你看到没有? 帮我问问你认识的人”).