单例模式是什么?
单例模式(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, ^{
});
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。