iOS常用的几个消息传递机制有delegate、NSNotification、block、KVO、Target-Action
delegate适用于两个相对较近的模块之间的消息传递, 是一对一的, 前提是接收者知道发送者, 并引用了它;
delegate实现大致分为以下几步:
需代理方: 设置代理协议 -> 定义代理方法 -> 设置代理属性 -> 代理调用代理方法
接收方: 遵循代理协议 -> 设置代理属性 -> 实现代理方法
NSNotification适用于不直接相关的模块之间的消息传递,通常是层级比较多的情况下使用, 典型特点是一对多, 一个通知发送者, 可以有多个通知接收者, 但是通知有一个比较明显的缺点, 不能知道通知执行的结果, 没有通知回调, 而且无法或者通知执行者的信息, 通知体现了设计模式中的观察者模式, 即订阅模式;
通知执行步骤需遵循: 先设置通知接收, 再发送通知;
需要注意的是, 在添加通知接收对象的同时要记得在对应位置添加上通知销毁的代码;
block在很多情况下可以起到和代理一样的作用, 执行block的对象是消息的发送者, 实现该block的对象是消息的接收者, 在使用block时特别需要注意循环引用的问题, 在blcok中用self去调用属性时特别容易造成循环引用, 解决方法为typedef一个self的weak属性, 在block中用该weak属性调用;
KVO是提供对象属性被改变时的通知的机制, 支持一对多, 使用KVO需要确保的两点是:
1、接收者需要知道发送者
2、接收者必须知道发送者的生命周期, 因为接收者需要在发送者被销毁前注销观察者的身份;
Target-Action 是回应UI事件典型的消息传递方式,继承自UIControl 的控件都有addTarget方法, 这个发送和接收关系比较松散, 消息的发送者和接收者可以互相不知道, 在此模式中, 不能携带自定义的参数, 可以选择性的将发送者和触发aciton的事件作为参数.