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

来源:互联网 发布:淘宝订单险加入条件 编辑:程序博客网 时间:2024/05/19 03:17

单例介绍

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

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

  • 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
原创粉丝点击