单例模式
什么是单例模式
- 单例模式是一种常见的软件设计模式,通过单例模式可以保证系统的类只有一个实现,也就是一个类只有一个对象实例
- 简单的来说,一个单例类,在整个程序中只有一个实例,并且提供一个类方法供全局调用,在编译时初始化这个类,然后一直保存在内存中,到程序APP)退出时由系统自动释放这部分内存。
- 单例模式是一种常用的设计模式,对于一个单例类,必须保证任意时刻只有一个单例对象,并且自行实例化该对象,并向整个系统提供该对象,也就是说无论实例化单例对象多少次,都只能创建出一个对象,该对象是全局的能够整个系统所访问
- 单例类可以实现不同对象之间的数据共享
单例模式的作用
- 在程序运行的时候,一个类只有一个实例,该实例方便于外界访问从而方便的控制了实例个数,节省了资源,防止了频繁的创建对象 回收对象带了的系统开销问题
优点
- 单例模式可以保证系统中一个类只一偶一个实例而且该实例易于外界访问,节省了系统资源
- 当我们想让程序的某个类的对象只能存在一个,单例模式即是最好的解决方案
注意
- 单例模式的对象一旦建立,对象指针保存在静态区,在程序结束后才会释放 详情参考 Static关键字及内存分区的详解
- 单例模式无法继承,扩展只能依靠子类来扩展
什么时候用单例
- 类有且有一个实例,并且需要一个方法来访问这个实例
- 需要实现不同对象之间的数据共享
创建一个单例
由于知识有限,这里只知道最简单的单例模式创建
- 懒汉模式 和饿汉模式
- 懒汉模式:在类加载的时候没有直接实例化,而是调用指定实例方法的时候再进行实例化,这样就能保证不想使用的时候也不会实例化。一般来说比饿汉模式的效率高。
- 饿汉模式:饿汉模式就是在类加载的时候立刻会实例化,后续使用就只会出现一份实例。
所谓懒汉创建法就是 时间换空间
饿汉:空间换时间
先声明静态全局变量,只能在当前文件访问 ,单例对象的条件
#import "Person.h"
static id instance;
static id SingleEg;
// 懒汉
@implementation Person
+(id) instance {
static dispatch_once_t o;
dispatch_once(&o, ^{
if (instance == nil) {
instance = [[super alloc] init];
}
});
return instance;
}
// 饿汉
+ (id)_singleEg {
static dispatch_once_t o;
dispatch_once(&o, ^{
SingleEg = [[super alloc] init];
});
return SingleEg;
}
后续学习到了会更新iOS单例模式的线程安全问题!
此博客只是简单的学习知道了单例模式,后续还会深入学习更新最新的知识点