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

单例介绍

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

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

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)sharedInstance{

//return [[self alloc] init];

return [[[self class] 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];

}

//面试写单例模式

static HLTestObject *instance = nil;

+ (instancetype)sharedInstance

{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

instance = [[[self class] alloc] init];

instance.height = 10;

instance.object = [[NSObject alloc] init];

instance.arrayM = [[NSMutableArray alloc] init];

});

returninstance;

}

+ (instancetype)allocWithZone:(struct _NSZone *)zone

{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

instance = [super allocWithZone:zone];

});

returninstance;

}

@end

你可能感兴趣的:(iOS-singleton(单例)三种创建方式)