美文网首页
单例创建的几种方法

单例创建的几种方法

作者: ErHu丶 | 来源:发表于2017-06-12 16:48 被阅读65次

方法一、(官方版)

这个方法为苹果公司官方的方法;

static id _sharedManager = nil;

+ (instancetype)defaultManager {
        if (_sharedManager == nil) {
            _sharedManager = [[super allocWithZone:NULL] init];
        }
    return _sharedManager;
}

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

- (id)copyWithZone:(NSZone *)zone
{
    return self;
}

解释:

[[Class alloc] init];其实是做了两件事。 alloc 给对象分配内存空间,init是初始化对象,包括设置成员变量初值等。而给对象分配空间,除了alloc方法之外,还有另一个方法: + (instancetype)allocWithZone:
而使用alloc方法初始化一个类的实例的时候,默认调用了+ (instancetype)allocWithZone: 方法,所以创建单例覆盖这个方法也是必须的了。

方法二、(完整版)

//全局变量
static id _sharedManager = nil;

//单例方法
+(instancetype)shareManager{
    return [[self alloc] init];
}

//初始化方法
- (instancetype)init{
    // 只进行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedManager = [super init];
    });
    return _sharedManager;
}

//alloc会调用allocWithZone:
+(instancetype)allocWithZone:(struct _NSZone *)zone{
    //只进行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedManager = [super allocWithZone:zone];
    });
    return _sharedManager;
}

//如果不刻意调用[object copy]�方法,下面的方法可以不使用
//copy会调用copyWithZone:
- (id)copyWithZone:(NSZone *)zone{
    return _sharedManager;
}

+ (id)copyWithZone:(struct _NSZone *)zone{
    return _sharedManager;
}

//mutableCopy会调用mutableCopyWithZone:
- (id)mutableCopyWithZone:(NSZone *)zone{
    return _sharedManager;
}

+ (id)mutableCopyWithZone:(struct _NSZone *)zone{
    return _sharedManager;
}

解释:

dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如@synchronized之类的来防止使用多个线程或者队列时不同步的问题。
对象是可以被copy/mutableCopy的,为了让被copy的对象也是“唯一”的,需要覆盖copy/mutableCopy的方法(如果可以保证不使用copy方法可以忽略这些方法的覆盖)

方法三、(简易版)

确保项目中只使用[Class shareManager]调用该类时可以用这个简易的方法。不能使用[[Class alloc] init];[object copy];这些方法调用呦~

+ (instancetype)shareManager {
    static ZingChatManager *_sharedManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedManager = [[Class alloc] init];
    });
    return _sharedManager;
}

相关文章

  • python面试题2

    python对象创建的过程python实现单例的几种方法@classmethod, @staticmethod用生...

  • 记录一次电话面试

    1.自我介绍这个是必须的吧问:单例的优缺点创建单例的方法多线程使用的场景,方法, 你用过那几种?YYkit源码的分...

  • 单例创建的几种方法

    方法一、(官方版) 这个方法为苹果公司官方的方法; 解释: [[Class alloc] init];其实是做了两...

  • 单例推荐的几种创建方法

    第一种(静态内部类): 第二种(枚举) 第三种(双重校验锁) //JDK 1.5之后,双重检查锁才能达到正常的单...

  • Swift-5行代码创建单例

    创建单例的方法

  • 单例模式、异常、模块

    单例模式 创建单例-保证只有1个对象 创建单例时,只执行1次init方法 目的 —— 让 类 创建的对象,在系统中...

  • iOS 创建单例的方法

    iOS 创建单例的方法 方法一: 方法二:

  • 懒加载和单例

    懒加载 声明属性 重写get方法 Swift 单例的创建方式 方式一:创建单例工厂方法(重写alloc完善) 声明...

  • ios 确保单例对象的唯一性

    之前创建单例是使用下面的方式: 这种方式创建的单例,如果外部使用了alloc方法来创建实例,或者copy方法拷贝了...

  • swift 单例

    创建单例类 掉用方法

网友评论

      本文标题:单例创建的几种方法

      本文链接:https://www.haomeiwen.com/subject/llilqxtx.html