iOS dispatch_once 创建单例

创建单例相信大家一定不陌生,简而言之就是一个类的实例方便我们在程序外界访问,也可以节省系统资源。单例的生命周期就是应用的生命周期。

1.一般的单例创建

1
2
3
4
5
6
7
8
+(Singleton *)singleton {
static Single *shared = nil;
if(shared == nil) {
shared = [[Single alloc] init];
}
return shared;
}

这是一个不安全的线程,如果多个线程同时访问就会出现问题,可能创建2个实例。

2.为了不让这种情况发生,一般会加@synchronize

1
2
3
4
5
6
7
8
9
+(Singleton *)singleton {
static Single *shared = nil;
@synchronized(self){
if(shared == nil) {
shared = [[Single alloc] init];
}
}
return shared;
}

3.但是加上@synchronize并没有dispatch_once速度快。dispatch_once能保证在多线程的情况下线程安全。

1
2
3
4
5
6
7
8
9
+(Singleton *)singleton {
static dispatch_once_t pred;
static Singleton *shared = nil;
dispatch_once(&pred, ^{
shared = [[Singleton alloc] init];
});
return shared;
}