Delegate 是协议的一种,顾名思义,就是委托他人帮自己去做什么事。也就是当自己做什么事情不方便的时候,就可以建立一个委托,这样就可以委托他人帮自己去实现什么方法。


我简单的总结了一下自己用到的委托的作用有两个,一个是传值,一个是传事件。


1.所谓传值经常用在b类要把自己的一个数据或者对象传给a类,让a类去展示或者处理。(切分紧耦合,和代码分块的时候经常用)


2.所谓传事件就是a类发生了什么事,把这件事告诉关注自己的人,也就是委托的对象,由委托的对象去考虑发生这个事件后应该做出什么反映。(这个经常见,例如在异步请求中,界面事件触发数据层改变等等)


3.利用委托赋值,这种方法感觉是为了不暴露自己的属性就可以给自己复值,而且这样更方便了类的管理,只有在你想要让别人给你赋值的时候才调用,这样的赋值更可控一些。(例如tableView中的委托(dateSource)中常见)。


Example:

delegate传的值是弱引用吗 ios delegate false_分块

NSNotification: 这是一个观察者模式, 一方添加观察者,一方发出通知。

首先在你需要监听的类中加入观察者:

[[NSNotificationCenter defaultCenter] addObserver:self
    selector:(SEL)aSelector
    name:aName object:(id)anObject];



这个观察者在监听到anObject发送名字为aName的notification时,调用selector的方法,在aSelector方法中得到userInfo。

anObject表示从谁那儿发送出来的消息。

一般的selector中的方法可以这么写:



- (void)method: (NSNotification:)sender { NSDictionary *dict = [sender userInfo]; }



也就是说监听到了anObject发出消息,消息的名字是aName,此时observer就调用aSelector方法,把notification的userInfo拷贝到本地。

发送通知:

[[NSNotificationCenter defaultCenter] postNotificationName:aName object:self];

通知中心将会区分它们对象对这些通知感兴趣并且通知他们。如果除了关心观察者的通知名称和观察的对象,还关心其他之外的对象,那么就把之外的对象放在通知的可选字典中,或者用方法


postNotificationName:object:userInfo:


移除通知:removeObserver:和removeObserver:name:object:

[[NSNotificationCenter defaultCenter] removeObserver:observer name:nil object:self];




总结:IOS中消息传递机制有很多,针对不同的机制,我们应该怎样选择?以下纯属个人看法:

1. 当一个界面需要回调子界面的方法,并且与其他任何界面没有关联,可以考虑使用block。

2. 当很多界面都使用到相同的实现方法,可以考虑使用代理。

3. 两个界面看起来没有任何关联,但有一方需要随时监听外来的消息,可以考虑使用通知。