单例介绍
单例模式: 一个类只有一个实例对象。
使用场合:在整个应用程序共享一份资源(这份资源只需要创建初始化一次)。
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