原理
iOS中消息通知是以notificationName来做为标识,发通知时,监听了同一个notificationName的实例会收到通知。
另一种方式是以protocol为标识,发通知时,以protocol+selector,来判断要发送给哪些实例。
做法如下:
- 将需要通知的方法定义成protocol,通常是将一组有关联的方法定义在同个protocol中。
- 以protocol为key,监听该protocol的实例(可能有多个)为value,组成映射关系,即protocol->observer list。
- 防止强引用实例,使用包装对象,用weak属性存储该实例。
- 发送通知时,根据protocol+selector,拿到对应的实例,进行调用,同时传递参数。
相比自带的消息通知(notificationName),好处是:
- 自带的消息通知,添加同一个notificationName多次,会收到多个通知,而这种方式会去重。
- 参数灵活,可直接传递,不用包装成dict和解dict。
- 避免移除系统通知的问题
- 实例对象以weak修饰,其释放后,会自动置为nil。避免野指针问题。
例子:
定义protocol
@protocol UserProtocol <NSObject>
@optional
- (void)logout