关闭

ios学习--单例实现的几种方式

341人阅读 评论(0) 收藏 举报
分类:

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


PS:swift 单例 ,还有线程保护

static let sharedSingleton = instance()



文/TobyoTenma(简书作者)
原文链接:http://www.jianshu.com/p/a9e9d503806a
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:178718次
    • 积分:2667
    • 等级:
    • 排名:第13754名
    • 原创:28篇
    • 转载:290篇
    • 译文:21篇
    • 评论:0条