从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 = 0
            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里实现了线程安全的机制。

 

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 330987132 | Go:217696290 | Python:336880185 | 做人要厚道,转载请注明出处!http://www.cnblogs.com/sunshine-anycall/p/4138110.html

时间: 2024-11-10 10:50:23

从Objective-C到Swift 单例模式的相关文章

程序员眼中的苹果Swift语言:简单 易学 高效

[摘要]Swift正式曝光在镁光灯前,叹息声.惊呼声此起彼伏.不过不用太过担心,Objective-C.Swift能够在同一个应用程序中并存.程序员眼中的苹果Swift语言:简单 易学 高效6月8日消息,对于苹果开发者来说,如今已经进入了"Swift时代".虽然编程语言Objective C备受喜爱,不过它作为苹果主流编程语言的日子已经所剩无几.随着WWDC开发者大会的落幕,Swift即将取而代之,成为苹果新iOS 8.OS X Yosemite的新宠.美国时间6月2日举行的苹果WWD

即使是封闭的苹果,也不得不开源了 Swift

在2015苹果WWDC上,最受欢迎和关注的不是iOS 9和OS X,也不是新的Apple Music,而是苹果软件工程副总裁 Craig Federighi 宣布,苹果的编程语言 Swift 2.0 将会开源. 为 什么大家会如此激动?在过去的15年间,开发者已经显示了对开源工具和平台的偏爱,然而苹果一直让开发者适应自己的技术,远离第三方技术.苹果这样做有一 定风险,有可能会与开发人员关系疏远,也正是这些开发人员一直在开发第三方应用或者服务.程序员想自由选择自己想要的工作方式 ,要留住他们,苹果

苹果推出覆盖Swift程序设计语言内容的新博客Swift Blog

网易科技讯 7月11日消息,据国外媒体报道,苹果周五专为开发者推出覆盖Swift程序设计语言内容的新博客Swift Blog,Swift程序设计语言由苹果在今年WWDC大会上发布. 苹果在一份简要的文字介绍中表示,该博客将让开发者观察到开发工程师设计Swift语言的内幕,此外还有最新的新闻和提示,从而让开发者成为具有创造性的Swift程序员.由于内容不断更新,苹果向开发者和其他有兴趣方面提供了RSS订阅.该公司在该新平台提供Swift兼容性更新.Swift应用将兼容于该公司目前的操作系统,即OS

Swift程序设计语言由苹果在今年WWDC大会上发布

网易科技讯 7月11日消息,据国外媒体报道,苹果周五专为开发者推出覆盖Swift程序设计语言内容的新博客Swift Blog,Swift程序设计语言由苹果在今年WWDC大会上发布. 苹果在一份简要的文字介绍中表示,该博客将让开发者观察到开发工程师设计Swift语言的内幕,此外还有最新的新闻和提示,从而让开发者成为具有创造性的Swift程序员.由于内容不断更新,苹果向开发者和其他有兴趣方面提供了RSS订阅.该公司在该新平台提供Swift兼容性更新.Swift应用将兼容于该公司目前的操作系统,即OS

《React Native移动开发实战》一一1.1 看透React Native

1.1 看透React Native React Native(http://facebook.github.io/react-native/)第一次进入公众的视野是在2015年1月的React.js Conf(http://conf.reactjs. org/)上,随后,同年5月份,Facebook在F8 Conference(https://www. fbf8.com/)上正式宣布:React Native项目(如图1.1所示) 在Github开源.结果一天之内,就收获了5000多颗星,受关

用React Native开发第一个iOS应用

我们想为用户设计一款移动端的应用,却不知从何下手,我们只知道每一个人都希望做一款又酷又好玩儿体验又十分顺滑的应用,然而团队里没人有移动端的经验. 于是,我们最终只好选择React Native作为我们的开发工具.结果证明,这是一个非常明智的选择,我们从开始到现在的所思所感,全都总结如下: 为什么要用React Native 我们是一群Web开发者,而不是iOS开发者.我曾参加过几个在纽约举办的有关Swift和Objective-C的线下聚会,但最后我依然认为编写Ruby和JavaScript代码

iOS自动化测试的那些干货

前言 如果有测试大佬发现内容不对,欢迎指正,我会及时修改. 大多数的iOS App(没有持续集成)迭代流程是这样的   也就是说,测试是发布之前的最后一道关卡.如果bug不能在测试中发现,那么bug 就会抵达用户,所以测试的完整性和可靠性十分重要. 目前,大多数App还停留在人工测试阶段,人工测试投入的成本最低,能够保证核心功能的使用,而且测试人员不需要会写代码. 但是,在很多测试场景下,人工测试的效率太低,容易出错.举两个常见的例子: 一个App的核心功能,在每一次发布版本前的测试必定会跑一遍

程序员40岁就得退休?如何在40岁后继续做软件开发?

简评:从进入软件相关的专业想必你肯定听过这句话,"IT行业的从业者,学不到老就活不到老",老师们一直在和我们说这个世界发展的太快了,他们当时大学时还学习的是Pascal语言,所以很多东西当你走出校门时就已经过时了,但是却应该保持一些学习的心和努力的精神,不断充实自己,这样才不会被时代的浪潮排到沙滩上.这是一个 42 岁的开发者所写经验分享文章.并且列出一些他 18 年多身为软件开发者的经验谈.许多部分看完后都会希望自己当时就能够了解,所以很推荐不论是新手或是老手都要好好阅读这一篇文章.

Android数据库Realm实践

Android开发中常用的数据库有5个: 1. OrmLite OrmLite 不是 Android 平台专用的ORM框架,它是Java ORM.支持JDBC连接,Spring以及Android平台.语法中广泛使用了注解(Annotation). 2. SugarORM SugarORM 是 Android 平台专用ORM.提供简单易学的APIs.可以很容易的处理1对1和1对多的关系型数据,并通过3个函数save(), delete() 和 find() (或者 findById()) 来简化C