iOS——Swift开发中的单例设计模式(摘译,非原创)
最近在开发一个小的应用,遇到了一些Objective-c上面常用的单例模式,但是swift上面还是有一定区别的,反复倒来倒去发现不能按常理(正常的oc to swift的方式)出牌,因此搜索了一些帖子。可能是xcode或者sdk的问题吧(我相信他们不会把未经测试的代码展示,吧?。。。),一些帖子中的代码犯了明显的错误,编译失败。于是有了这篇文章,分享给大家。
原作者实现了一种单例,但是红色代码导致非线程安全:
class var sharedInstance:TPScopeManager {
get {
struct Static {
static var instance : TPScopeManager? = nil
} 7 if !Static.instance {
8 Static.instance = TPScopeManager()
9 } return Static.instance!
}
}
于是有了下面这些解决方案(个人感觉很精彩):
全局常量
第一种:直接声明全局变量
let _SingletonSharedInstance = Singleton() class Singleton {
...
}
优点:代码最简洁。
缺点:代码开放度较乱
第二种就弥补了上面的缺点
private let _SingletonSharedInstance = Singleton() class Singleton {
class var sharedInstance : Singleton {
return _SingletonSharedInstance
}
}
注:因为不支持类型常量(即类的静态常量),所以这里使用了全局常量
这种方式支持延迟(lasy)初始化,因为Swift会延迟初始化全局常量(和变量),并且let关键字是线程安全的。(言外之意:全局变量也是延迟初始化的,但非线程安全?我表示不确定,请大神赐教)
Nested struct(估且译为内部struct吧)
class Singleton {
class var sharedInstance : Singleton {
struct Static {
static let instance : Singleton = Singleton()
}
return Static.instance
}
}
类不支持类型常量(即类的静态常量),但struct支持。利用此,可以达到类似的效果。
原著建议使用内部struct的方式,除非新版本中支持了类型变量
dispatch_once(这个真不能翻译)
传统的OC方式在Swift中也是支持的,对比上一种方式,这种方式很明显没有任何优势,但是还是写出来吧
class Singleton {
class var sharedInstance : Singleton {
struct Static {
static var onceToken : dispatch_once_t =
static var instance : Singleton? = nil
}
dispatch_once(&Static.onceToken) {
Static.instance = Singleton()
}
return Static.instance!
}
}
(原理一样,还是用struct支持类型变量这一优势,来把OC的dispatch_once方式平移过来)
如上所述,苹果官方已经明确声明延迟初始化是线程安全的,所以,没有必要再加一层dispatch_once或者类似的保护措施。
全局变量(struct和enum内部的静态成员也同样)的延迟加载本质是dispatch_once,因此如果想使用dispatch_once,不如直接声明一个私有全局变量,即保证了线程安全,也不会使代码过于open
我比较喜欢全局变量方式(当然是经过优化的那种),不用嵌套一层struct,比较简洁。大家喜欢哪种呢?
英语好的可以直接看原帖 http://stackoverflow.com/questions/24024549/dispatch-once-singleton-model-in-swift
iOS——Swift开发中的单例设计模式(摘译,非原创)的更多相关文章
- iOS--Swift开发中的单例设计模式
最近在开发一个小的应用,遇到了一些Objective-c上面常用的单例模式,但是swift上面还是有一定区别的,反复倒来倒去发现不能按常理(正常的oc to swift的方式)出牌,因此搜索了一些帖子 ...
- IOS中的单例设计模式
单例设计模式是IOS开发中一种很重要很常用的一种设计模式.它的设计原理是无论请求多少次,始终返回一个实例,也就是一个类只有一个实例.下面是苹果官方文档中关于单例模式的图片: 如图所示,左边的图是默认的 ...
- iOS 开发中的单例
在iOS开发中经常会用到单例,比如每个iOS程序本身就是一个单例,在比如进行个人偏好设置存储的时候用的也是一个单例.那我们如何自己来写一个单例类呢,用自己的单例对象呢?下面是我写的一个单例的头文件里的 ...
- iOS 中的单例设计模式
单例设计模式:在它的核心结构中只包含一个被称为单例类的特殊类.例如文件管理中的NSUserDefault,应用程序中的UIApplication,整个应用程序就这一个单例类,负责应用程序的一些操作,单 ...
- OC中的单例设计模式及单例的宏抽取
// 在一个对象需要重复使用,并且很频繁时,可以对对象使用单例设计模式 // 单例的设计其实就是多alloc内部的allocWithZone下手,重写该方法 #pragma Person.h文件 #i ...
- Java中常用来处理时间的三个类:Date、Calendar、SimpleDateFormate,以及Java中的单例设计模式:懒汉式、饿汉式以及静态内部类式
(一)java.util.Date类 1.该类有一个long类型的属性:用来存放时间,是用毫秒数的形式表示,开始的日期是从1970年1月1号 00:00:00. 2.该类的很多方法都已经过时,不 ...
- Python中的单例设计模式
1)设计模式: 是前人工作的总结和提炼.通常,被人们广泛流传的设计模式. 某一问题的特定解决方案,使用设计模式是为了可重用代码,是代码更容易被人理解, 增加代码的可用性. 2)单例设计模式: ...
- java中的单例设计模式
单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供 ...
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...
随机推荐
- 更好更快更高效解析JSON说明
现在来一个实例解析类,直接就把解析JSON到QVariant去了.唯一不足的是没有搞错误处理,具体方法也请各位自行参考json-c的发行文档,这样比较方便叙述,STL或者Boost我都没有认真接触过, ...
- 树莓派(raspberry pi)学习4: 更改键盘布局(转)
树莓派(raspberry pi)用了几次后,发现键盘老是按错,一些字符打不出来或打错 这个问题,折腾我半天.还是把心得分享一下吧 上网查,发现是键盘布局不对,树莓派(raspberry pi)是英国 ...
- Dynamic CRM2016在一台本地服务器安装部署
在本地单独一台服务器上安装部署CRM2016时需要提前安装好CRM软件需要的必备软件,具体需要安装的组件如下截图:其中required为必须具备的安装组件.license可以采用微软官网的90天测试版 ...
- 使用Dapper时,如何将MySqlParameters[] 变成Dapper.DynamicParameters动态对象
在开发过程中,如何替原生的参数化MySqlParameters[]换成Dpapper的参数化DynamicParameters对象正确的做法:var args = new DynamicParamet ...
- SAS文档:简单的随机点名器
本次实验,我们设计了一个简单的随机点名系统,下面我来介绍一下它的SRS文档. 1.功能需求: 1.1 模块1 在此模块中,我们设置了RandomName类,创建一个随机点名器,里面加入了所在课程的名单 ...
- zend 汉化
http://jingyan.baidu.com/article/4f34706ecdb566e387b56d05.html
- AngularJs 返回上一页
html <script src="lib/angular/angular-1.4.9/angular.js"></script> <script s ...
- [linux]树莓派入手体验和系统安装
背景 一直想捣鼓点什么东西.当看到树莓派的时候,就是它了. 树莓派可以安装Linux系统,而我在工作当中,可以说Linux是一半工作环境.树莓派真是个好东西,这个东西应该在我学习linxu/Unix的 ...
- 拾遗:『Linux Capability』
『Linux Capability』 For the purpose of performing permission checks, traditional UNIX implementations ...
- Web前台直接加载GIS格式数据分析
本文以Flex直接加载Shp.DWG和MDB为例. 首先看一份现估测数据: 1) 加载Shp文件,目前直接由前台Flex代码完成: 图1 在ArcCatalog里面的Shp文件 图2 直接在前台加载 ...