iOS常见设计模式

1 单例设计模式

 顾名思义,就是一个的意思,对于object-c来说,就是只希望一个类只有一个实例,在整个项目中创建以后,就不会再重复创建。它的这种特性,可以广泛应用于某些需要全局共享的资源中,或者处理一些全局通用逻辑中,比如管理类,引擎类,也可以通过单例来实现传值。UIApplication、NSUserDefaults等都是IOS中的系统单例。

优点:节约内存资源。

缺点:生命周期太长,容易“失控”,原则上能不用则不用,或者少用。

2 代理设计模式

代理有三个重要的概念:协议(制定代理双方要做的事),代理(根据指定协议,完成委托方需要实现的功能),委托(根据指定协议,指定代理方需要做的事情)。简单来讲代理就是委托方把自己的一些逻辑交给代理方实现,委托方的代理属性本质上就是代理对象,设置委托代理就是代理属性指针指向代理对象,相当于代理对象只是在委托方中调用自己的方法。代理有效解决了对象间的通信和耦合问题(松耦合)。

代理内存管理:

委托方的代理属性变量使用weak修饰,如果使用强引用,委托方持有代理方,代理方持有委托方,从而造成循环引用。

注:weak和assion都可以弱引用代理对象,是一种“非拥有的关系”的指针,都不会对对象的引用计数造成影响。但是当指向的对象被释放的时候,weak修饰的指针会自动指向nil,而assion修饰的不会,在iOS中向一个nil发送消息时不会造成崩溃,assion会引起野指针(指针指向的对象已经被回收掉了)调用。

代理和block的区别:

代理和block功能都差不多,都是完成对象间的通信,是一种解耦合的方式,至于那个更好,那个不好,没有特别的区别,如下简单介绍不同的情况是选择代理,或者block:

(1)多消息传递的时候应该使用代理。

多个消息传递的时候,因为代理是实现一个个方法,这样开起来非常清晰,而block反而是看起来非常的臃肿,而且block可能会引起循环应用等问题,多一个block则出错的概率就会大一点。如:原生的UITableview,则是使用代理实现的。

(2)代理比较注重过程的,而block注重结果。

从设计的角度来讲,代理更佳面向过程,block更佳面向结果。如:XML数据解析,解析的过程就是使用代理来完成的;网络请求的成功,或者失败后的结果则是通过block回调来完成的。

(3)从性能上来讲,block的性能消耗略大于代理。

因为block涉及到一个栈区拷贝到堆区的操作,所以不管是从时间上,还是内存资源上都比代理消耗更多,而代理代理只是定义了一个方法列表,在遵守协议对象的objc_protocol_list中添加一个节点,在运行时向遵守协议的对象发送消息即可。

(4)一般委托对象的代理代理属性只能有一个代理对象,如果有多个的时候,应该选择block。

当一个代理属性有多个代理对象的时候,只有一个是有效,就相当于重复给代理属性赋值,实际上只有最后一个是有效的。

(5)单例不能使用代理。

单例始终是只有一个对象,当在多个代理类中设置代理属性时,只有最后一个设置的代理属性有效,前面的都会被覆盖,最终只有一个对象可以正常响应。

block和delegate乍看上去在作用上是很相似,但是关于它们的选型有一条严格的规范:当回调之后要做的任务在每次回调时都是一致的情况下,选择delegate,在回调之后要做的任务在每次回调时无法保证一致,选择block。在离散型调用的场景下,每一次回调都是能够保证任务一致的,因此适用delegate。这也是苹果原生的网络调用也采用delegate的原因,因为苹果也是基于离散模型去设计网络调用的,而且本文即将要介绍的网络层架构也是基于离散型调用的思路去设计的。在集约型调用的场景下,使用block是合理的,因为每次请求的类型都不一样,那么自然回调要做的任务也都会不一样,因此只能采用block。AFNetworking就是属于集约型调用,因此它采用了block来做回调。

3 观察者设计模式

KVO(键值观察

KVO是苹果提供的一种回调机制,当某个对象注册监听者后,被监听的对象属性发生改变时,对象会发送一个通知给监听者,一遍监听者执行回调操作。

使用:

(1)注册,如:[self.tableView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];

(2)实现回调的方法

(3)移除。dealloc中移除掉。

通知(NSnotificationCenter)

一种典型的有调度中心的观察者模式实现方式,以NSNotificationCenter为中心,观察者往Center中注册对某个主题对象的变化感兴趣,主题对象通过NSNotificationCenter进行变化广播。它是一个“一对多的关系”。NotificationCenter就像一个枢纽一样,处在整个观察者模式的核心位置,调度着消息在观察者和监听者之间传递。

你可能感兴趣的:(iOS常见设计模式)