Swift单例实现与经验分享

前言

这些天在研究利用Objective-C的runtime的method swizzling,发现简直是黑魔法啊,有兴趣的同学可以看看,链接传送门:http://nshipster.com/swift-objc-runtime/

看到里面使用dispatch_once来实现的单例,保证线程安全,我在这篇文章中也分享下我对Swift单例的理解与用法吧

单例的英文: Singleton

我所了解在Swift中有三种实现单例的方法,科学的在前面 :)

1. 类常量 Class Constant

在Swift1.2,Swift2以上的童鞋们请自觉考虑这种方法
class Singleton {
    static let sharedInstance: Singleton = Singleton() 
}

这是一个会被整个当前class所分享的常量,并且不会被subclass所override,let保证了这个是线程安全滴。同时Swift在这里很机智的实现了懒加载,所以变得更加科学了。

不过注意Swift1.2以下是不支持,如果要考虑到向下兼容,请看继续看下面的方法。

2. Nested结构

class Singleton {
    class var sharedInstance {
        struct SharedStatic {
            static let instance: Singleton = Singleton()
            return SharedStatic.instance
        }
    }
}

这样写也很科学,虽然长了很多,至少是安全并且合理的。这里的class var就是静态变量,class func同理是静态函数,就像是static function一样的感觉。

3. GCD的dispatch_once

class Singleton {
    class var sharedInstance {
        struct SharedStatic {
            static var token: dispatch_once_t = 0
            static var instance: Singleton? = nil
        }
        dispatch_once(&SharedStatic.token) { SharedStatic.instance = Singleton() }
        return SharedStatic.instance!
    }
}

这是传统Objective-C处理单例的写法,熟悉GCD的童鞋应该都了解过,不知道为何在国内很多文章中这种做法是被首推的,在我查阅了许多国内外的文档之后,基本确认这种方法相对于上面两种没有任何优势,除了看起来比较牛逼。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,251评论 4 61
  • 从头到尾的真相没办法说出来,总是受到所有人的质疑却无法解释或不想解释,也许我真是这样的人,从不反抗,但请别让我爆发
    一秋而冬阅读 163评论 0 0
  • 导语:“墙里开花墙外香”这是现如今游戏出海的真实写照,根据Newzoo的统计,中国2017年截止到4月底的游戏收入...
    报表哥阅读 368评论 0 1