在 iOS 开发过程中,我们经常会用到各种单例,例如 NSFileManager
,UIApplication
等,这些是系统给我们提供的单例类;有很多时候由于各种各样的原因,我们自己也需要写单例;
下面来说一下我们常用到几种单例的实现方式:
1.第一种方式,重写+allocWithZone:方法;
这个方法为苹果公司官方推荐的,看这里;但是苹果官方的写法中,没有互斥锁,这样并不能保证在多线程中的线程安全,所以这里我用到 @synchronized
来保证线程安全;
+(instancetype)allocWithZone:(struct _NSZone *)zone{
static id instance = nil;
@synchronized (self) { //为了线程安全,加上互斥锁
if (instance == nil) {
instance = [super allocWithZone:zone];
}
}
return instance;
}
2.第二种方式,不用重写+allocWithZone:方法,而是直接用@synchronized
来保证线程安全,其它与上面这个方法一样;
+(instancetype)sharedSingleton{
static id instance = nil;
@synchronized (self) {
if (!instance) {
instance = [[self alloc] init];
}
}
return instance;
}
3.第三种方式,通过 GCD 的 dispatch_once
来实现单例,同样可以在保证线程安全的前提下来实现单例
+(instancetype)sharedSingleton{
static id instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
网友评论
static let sharedSingleton = instance()