设计模式-单例模式

单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点。


要点

  • 某个类只有一个实例
  • 必须自行创建实例
  • 自行向整个系统提供这个实例

优点

  • 实例控制:阻止产生自身的对象副本,保证所有对象都访问唯一实例
  • 灵活性:灵活修改实例化过程iOS的单例模式

缺点

  • 单例类的职责过重,一定程度违背了单一职责原则
  • 不能被继承,不能有子类,不易重写或扩展
  • 闲置时并不会被销毁,消耗系统内存资源

iOS单例模式的实现

基本思路:创建对象分为alloc(申请内存),init(初始化)两个步骤,在alloc时进行拦截。

调用alloc方法 —oc内部调用—> allocWithZone方法

同时调用copy方法也会产生对象副本,这时我们也要进行拦截。

调用copy方法 —oc内部调用—>copyWithZone方法

另外把mutableCopy也进行拦截

#import "Singleton.h"

@implementation Singleton

+ (instancetype)shareInstance {
    static Singleton *_instance = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (_instance == nil) {
            _instance = [[super allocWithZone:nil] init];
        }
    });
    return _instance;
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    return [Singleton shareInstance];
}

- (id)copyWithZone:(struct _NSZone *)zone {
    return [Singleton shareInstance];
}

- (id)mutableCopyWithZone:(struct _NSZone *)zone {
    return [Singleton shareInstance];
}

@end