iOS 开发中单例实现的几种方式

在 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;
}

你可能感兴趣的:(iOS 开发中单例实现的几种方式)