单例模式是什么?
单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。单例模式的要点有三个:
单例类只能有一个实例。
单例类必须自己创建自己的唯一实例。
单例类必须给所有其他对象提供这一实例。
单例模式的使用场合
类只能有一个实例,并且必须从一个为人数值的访问点对其访问。
这个唯一的实例只能通过子类化进行拓展,并且拓展的对象不会破坏客户端代码。
类图
时序图
如何实现单例
在Objective-C中方法都是公有的,而且OC的语言本身是动态类型的,因此所有类都可以相互发送对方的消息,而没有太多的编译时检查,而且Cocoa框架使用计数的内存管理方式来维护对象的内存中的生存期。所有这些特性使得Object-C中实现单例模式颇具挑战性。
步骤
在类的内部提供一个static修饰的全局变量
提供一个类方法,方便外界访问
重写+allocWithZone方法,保证永远都只为单例对象分配一次内存空间
严谨起见,重写-copyWithZone方法和-MutableCopyWithZone方法
代码实现
+ (instancetype)sharedInstance{ @synchronized (self) { if (_instance == nil) { _instance = [[super allocWithZone:NULL] init]; } } return _instance;}+ (instancetype)allocWithZone:(struct _NSZone *)zone{ return [self sharedInstance];}- (id)copy{ return _instance;}- (id)mutableCopy{ return _instance;}
这是一个严格的单例实现,但是存在一个问题,欢迎留言指出。
当然也可以使用GCD方式实现,不过这里只做演示static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ });