Swift线程安全的单例实现

ryanly

介绍

  • 单例模式在开发中尤为常见,最大的好处就是内存中只会保留一个对象,节省内存开销,同时便于对象的建立和维护。

一个简单的单例

    class Singleton  {
       static let sharedInstance = Singleton()
    }
  • 这个单例,如此的简单那么他是线程安全的吗?答案是—————是!而且他也是懒加载的!原因很简单,let定义的属性本身就是thread safe的,同时static定义的是一个class constant,拥有全局作用域和懒加载特性。Swift的单例实现是不是简单得令人发指?!(当然这是在Swift1.2才支持的)

  • 如果你是Swift1.2以下的你可以这么写

class Singleton {
    class var shared: Singleton {
            return Inner.instance
    }
 
    struct Inner {
        static let instance: Singleton = Singleton()
    }
}

用GCD来实现线程安全

class Singleton {
    class var shared: Singleton {
        if Static.instance != nil{
            dispatch_once(&Static.onceToken) {
                Static.instance = Singleton()
            }
        }
        return Static.instance!
    }
    struct Static {
        static var instance: Singleton?
        static var onceToken: dispatch_once_t = 0
    }    
}
  • 这个实现大家应该相当熟悉,这里就不再过多介绍了。

阅读 6.6k

Ryan's fault
只是一个经常写出bug的程序员
190 声望
18 粉丝
0 条评论
190 声望
18 粉丝
文章目录
宣传栏