单例模式是什么?

单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。单例模式的要点有三个:
  • 单例类只能有一个实例。

  • 单例类必须自己创建自己的唯一实例。

  • 单例类必须给所有其他对象提供这一实例。

单例模式的使用场合
  • 类只能有一个实例,并且必须从一个为人数值的访问点对其访问。

  • 这个唯一的实例只能通过子类化进行拓展,并且拓展的对象不会破坏客户端代码。

类图

clipboard.png

时序图

clipboard.png

如何实现单例

在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, ^{
        
    });

danielmea
28 声望8 粉丝

程序猿的逗比日常-------