从Objective-C到Swift 单例模式
在Objective-C中经常会用到单例模式。最常见的就是:
[UIApplication sharedApplication].delegate
这里的sharedApplication就是一个返回单例的方法。所谓的单例模式也就是在整个APP、或者软件中只有这个类的这么一个对象。可以保存一些全局的设置等数据,达到单例对象变了整个app的全部设置都更新的效果。
忽略OC的代码,直接进入Swift代码。
第一种单例模式的实现:
class Singleton1{
class var sharedInstance: Singleton1 {
return _SharedInstance
}
}
private let _SharedInstance = Singleton1()
var s1 = Singleton1()
这是第一种,最简单的单例模式的实现。在需要单例实现的类外面声明一个全局的私有常量,private let _SharedInstance = Singleton1()。之后,在单例类的computed property中声明一个类属性,并在其中返回这个类外面的单例类的实例。非常简单,但是有效的方法!
第二种单例的实现:
class Singleton2{
class var sharedInstance: Singleton2{
struct Instance{
static let instance: Singleton2 = Singleton2()
}
return Instance.instance
}
}
var s2 = Singleton2()
这个实现用到的是内嵌类型。在computd property中定义了一个结构体。并在整个结构体中声明了一个静态的(class里面用的就是class关键字来声明静态的方法或者属性的)常量属性初始化了一个单例的实例。并在单例类的computed property中返回结构体总的实例。
第三种单例:
class Singleton3{
class var sharedInstance: Singleton3{
struct Instance {
static var onceToken: dispatch_once_t =
static var instance: Singleton3? = nil
}
dispatch_once(&Instance.onceToken){
Instance.instance = Singleton3()
}
return Instance.instance!
}
}
var s3 = Singleton3()
这个实现用到的是类似于OC中GCD的东西。这个单例是线程安全的。其实现方式类似于第二种单例,只是加了线程锁,保证了多线程情况下可以安全的调用。
实现单例模式的关键就是在于单例的类的构造函数不能被随意的访问。咱们的这些实现方式其实都可以任意的初始化实例。其能达到的效果是在按照约定的调用方式可以达到单例的效果。在以上的实现中。第一种定义了一个私有的常量实例,在约定的调用方法之外,其他的类是访问不到这个私有常量的。第二种和第三种比较类似,都是在computed property中定义了一个嵌套类型。这样,在其他的类对象中无法访问到这个computed property中的内嵌类型。第二、三种点不同之处就在于,第二种是直接在结构体里就初始化了单例的实例,而第三种是在computed property里实现了线程安全的机制。
从Objective-C到Swift 单例模式的更多相关文章
- Swift - 单例模式的实现
过去Swift要实现单例,无非是这三种方式:全局变量,内部变量和dispatch_once方式.但都略显繁琐. 后来从1.2版本起,Swift中添加了如 static let 和 static var ...
- swift 单例模式
class ca{ ; static var instance:ca = ca(); class func GetInstance()->ca{ return instance; } } var ...
- 【转载】谷歌酝酿将苹果Swift作为安卓APP主要开发语言
TNW中文站 4月8日报道 安卓操作系统的软件开发语言是Java,而在过去几年中,有关Java的版权,谷歌(微博)和甲骨文之间发生了长期的诉讼.最新外媒消息称,谷歌正在考虑将苹果开发的Swift作为未 ...
- Object-C与Swift混合开发
Object-C作为Apple的iOS App开发语言服务了很多个年头,2014年Apple推出了新的编程语言Swift.更高效更安全的口号再次吸引了一大批非iOS开发程序猿进入,小编觉得Swift代 ...
- Swift新手教程系列5-函数+selector在swift中的使用方法
原创blog.转载请注明出处 近期在用swift写代码,尽管遇到一些问题,可是代码量确实减了不少. swfit新手教程系列会随着我使用swfit中的积累,不断地去修正更新 之前的教程 swift单例模 ...
- 2016年iOS技术圈回顾
2016年同2015年一样,在我还没有做好心理准备的时候,一晃神就到了年底.年关将近,不知诸君心情如何,年初的规划实现了多少,来年的计划又是否已有了眉目.年过三十的Peak君感觉年关是越来越难过了,越 ...
- fir.im Weekly - 这是一份强大的 SwiftGuide
大新闻!Apple 10 亿美元融资滴滴!库克大叔对中国 iOS 开发者表达了高度认可,同时也传出 iOS 10 将内置滴滴 App 的消息.想像下,某个加班的深夜飙完代码,最性感的事情莫过于:「Si ...
- 设置app的状态栏样式
http://www.jianshu.com/p/9f7f3fa624e7 http://cocoa.venj.me/blog/view-controller-based-status-bar-sty ...
- 转: app端数据库(性能高) realm (ios, android 均支持)
转: http://ios.jobbole.com/85041/ 移动端数据库新王者:realm 2016/05/14 · iOS开发 · 数据库 分享到:0 原文出处: 没故事的卓同学(@没故事的 ...
随机推荐
- SQL Server中的事务与其隔离级别之脏读, 未提交读,不可重复读和幻读
原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...
- linux CentOS 安装rz和sz命令 lrzsz 实现windows和linux之间的文件上传 下载
https://blog.nbhao.org/1902.html https://bbs.csdn.net/topics/391989523 https://www.cnblogs.com/zhoul ...
- node使用JsonWebToken 生成token,完成用户登录、登录检测
最近在用node做后台的登录,检测登录功能.在本地使用session可以成功,但是放服务器后发现session失效了,每次请求session都会变化,着了很久原因.原来,自己项目是前后端分离的,前端调 ...
- [译]作为一个web开发人员,哪些技术细节是在发布站点前你需要考虑到的
前日在cnblogs上看到一遍文章<每个程序员都必读的12篇文章>,其中大多数是E文的. 先译其中一篇web相关的”每个程序员必知之WEB开发”. 原文: http://programme ...
- 使用TensorFlow识别照片中的物体
1.环境ubuntu14.04.5 安装TensorFlow 官方文档:https://www.tensorflow.org/install/install_linux sudo pip instal ...
- spring jpa sqls
package com.example.repository; import java.util.List; import org.springframework.data.jpa.repositor ...
- Kafka学习之broker配置(0.8.1版)(转)
broker.id 默认值:无 每一个broker都有一个唯一的id,这是一个非负整数,这个id就是broker的"名字",这样就允许broker迁移到别的机器而不会影响消费者. ...
- 在MarkDown中插入数学公式对照表(持续更新)
目录 在MarkDown中可以插入数学公式,但是在博客园和有道云笔记之中的数学公式插入方式略有不同(博客园需要先在后台选项中开启插入数学公式选项): 代码 行内公式 整行公式 博客园 $数学公式$ $ ...
- css继承和层叠
在前面介绍了如何利用文档结构和css选择器为元素应用各种丰富的样式,今天来好好聊聊css的层叠和继承,先说说概念. 继承:一个元素向其后代元素传递属性值所采用的机制,说的通俗点,就是元素的某些属性可以 ...
- SpringMvc配置拦截器
SpringMVC可以通过配置拦截器,进行url过滤等处理. 在spring-mvc.xml的配置文件中,如下示: 其中,在<mvc:interceptors>中可以配置多个拦截器< ...