代理设计模式:
- 主要作用:通过引入代理对象的方式来间接访问目标对象。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用;防止直接访问目标对象带来的不必要复杂性;
- 代理包括三部分:代理,委托,协议
- 优点:
- 职责清晰:被代理对象只负责自己实际的业务逻辑,不关心其他非本身的职责。并将其他事务可以通过代理类处理。
- 高扩展性:无论被代理对象如何改变,只要代理类和被代理类都实现了统一接口,都不用修改代理类,而且即使扩展了新的被代理类,代理类也可以使用。
- 降低耦合度:能够协调调用者和被调用者,在一定程度上降低了系统的耦合度
- 保护代理:可以控制对一个对象的某些访问权限,及隐藏委托类的实现
- 缺点:
- 只能一对一
Block回调
- block是一种轻量级的回调,可以直接访问上下文;
- 优点:
- block的代码可读性更好,因为block只要实现就可以了
- 由于block的代码是内联的,运行效率更高
- 可以把block当做一个成员变量、属性、参数使用,使用起来非常灵活
- 缺点:
- blcok的运行成本高。block出栈需要将使用的数据从栈内存拷贝到堆内存
- block容易造成循环引用,而且不易察觉。因为为了blcok不被系统回收,所以我们都用copy关键字修饰,实行强引用。block对捕获的变量也都是强引用,所以就会造成循环引用
代理与Block的选择:
- 如果回调的状态过多、多个消息传递,使用代理
- 如回调的次数很频繁,使用代理
- delegate运行成本低,block成本很高的;delegate只是保存了一个对象指针,没有额外消耗,只多做了一个查表动作(相对C的函数指针)
观察者模式
涉及多个对象都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对象中的数据变化,在这样的情况下就可以使用观察者模式
- 优点:
- 观察者和被观察之间是抽象耦合,容易扩展,
- 缺点:
- 运行效率较低,一个被观察者,多个观察者时,开发代码和调试会比较复杂
- 通知虽然耦合低但不能被滥用,通知还考虑多线程调用(如果对观察者的通知是通过另外的线程进行异步投递的话,必须保证投递是以自恰的方式进行的)
单例模式
为了确保程序运行期某个类,只有一份实例,用于进行资源共享控制。可用于跨模块传值
- 优点:
- 提供了对唯一实例的受控访问
- 由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能
- 缺点:
- 单例类的职责过重,在一定程度上违背了“单一职责原则”
- 由于单利模式中没有抽象层,因此单例类的扩展有很大的困难
- 不可过多的创建单例,因为单例从创建后到彻底关闭程序前都会一直存在,如果过多的创建单例无疑浪费系统资源和影响系统效率
6. @autoreleasePool 的数据结构
简单说是双向链表,每张链表头尾相接,有 parent、child指针
每创建一个池子,会在首部创建一个 哨兵 对象,作为标记
最外层池子的顶端会有一个next指针。当链表容量满了,就会在链表的顶端,并指向下一张表。