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

作者: TobyoTenma | 来源:发表于2016-06-01 08:05 被阅读972次

    在 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 开发中单例实现的几种方式

      本文链接:https://www.haomeiwen.com/subject/iefcdttx.html