iOS-singleton(单例)三种创建方式

作者: iOS开发周立贺 | 来源:发表于2017-08-21 15:31 被阅读319次

单例介绍

  • 单例模式: 一个类只有一个实例对象。

  • 使用场合:在整个应用程序共享一份资源(这份资源只需要创建初始化一次)。

  • ARC实现单例

    • 在类的内部提供一个static修饰的全局变量static SingletonVC * _singletonVC;
    • 提供一个类方法方便外界访问+ (instancetype)share;
    • 重写initWithZone方法,保证永远只为单例分配一次存储空间。

单例写法

  • 第一种:GCD的一次函数(dispatch_once_t
  • 推荐指数:❤❤❤❤❤
#import "SingletonVC.h"

// 创建静态对象 防止外部访问
static SingletonVC * _singletonVC;

@implementation SingletonVC

+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    
    static dispatch_once_t onceToken;
    // 一次函数
    dispatch_once(&onceToken, ^{
        if (_singletonVC == nil) {
            _singletonVC = [super allocWithZone:zone];
        }
    });
    
    return _singletonVC;
}

+ (instancetype)share{
    
    return  [[self alloc] init];
}

@end
  • 第二种:线程锁
  • 推荐指数:❤❤❤
#import "SingletonVC.h"

// 创建静态对象 防止外部访问
static SingletonVC * _singletonVC;

@implementation SingletonVC

+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    
    //线程锁
    @synchronized (self) {
        if (_singletonVC == nil) {
            
            _singletonVC = [super allocWithZone:zone];
        }
    }
    
    return _singletonVC;
}

+ (instancetype)share{
    
    return  [[self alloc] init];
}

@end

  • 第三种:懒加载模式
  • 推荐指数:❤
  • 不推荐使用这种方法,线程不安全。
#import "SingletonVC.h"

static SingletonVC * _singletonVC;

@implementation SingletonVC

+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    
    if (_singletonVC == nil) {
        _singletonVC = [super allocWithZone:zone];
    }
    return _singletonVC;
}

+ (instancetype)share{
    
    return  [[self alloc] init];
}

@end

相关文章

网友评论

  • 旮哥:其他都是重复找轮子,效率低下。基于c语言call_once的才是正解。能不能少一些这类低质量文章,无超新
    iOS开发周立贺:@旮哥 这些才是日常开发用的,发给忘记怎么写的人以及新手,以及自己偶尔也会加深印象,你说的c语言的,我请教你,怎么写,请评论出来。给我和以后的学者借鉴一下,h
  • Miles_miles:除了dispatch_once_t是单例,其他可不是哦;最后也重写下-copyWithZone方法
    iOS开发周立贺:@zhiyiLiu 怎么不是,解释一下

本文标题:iOS-singleton(单例)三种创建方式

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