• 在看了其他语言的单例实现后,于是去查了一下swift单例的实现,发现swift单例实现及其的简单,简单到我对它正确性产生怀疑。我们首先简单了解一下单例模式。 单例规则 单例必须是唯一的,所以它才被称为单例。...
    #前言
    在看了其他语言的单例实现后,于是去查了一下swift单例的实现,发现swift单例实现及其的简单,简单到我对它正确性产生怀疑。我们首先简单了解一下单例模式。
    #单例规则
    - 单例必须是唯一的,所以它才被称为单例。在一个应用程序的生命周期里,有且只有一个实例存在。单例的存在给我们提供了一个唯一的全局状态。比如我们熟悉的NSNotification,UIApplication和NSUserDefaults都是单例。
    - 为了保持一个单例的唯一性,单例的构造器必须是私有的。这防止其他对象也能创建出单例类的实例。
    - 为了确保单例在应用程序的整个生命周期是唯一的,它就必须是线程安全的。当你一想到并发肯定一阵恶心,简单来说,如果你写单例的方式是错误的,就有可能会有两个线程尝试在同一时间初始化同一个单例,这样你就有潜在的风险得到两个不同的单例。这就意味着我们需要用GCD的dispatch_once来确保初始化单例的代码在运行时只执行一次。 
    
    #单例模式为什么存在
    ###优点:
    单例对象保证了只有一个实例的存在,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。 另一方面,全局单一对象也减少了不必要的对象创建和销毁动作提高了效率。
    ###缺点:
    - 全局共享可修改的状态:单例模式的副作用之一就是那些共享状态量在 app 的生命周期内都可能发生修改,而这些修改可能造成一些位置错误。更为糟糕的是因为作用域和生命周期的特性,这些问题还非常难定位。
    - 依赖关系不明确:因为单例在全局都非常容易进行访问,这将是我们的代码变成所谓的 意大利面条 式的代码。单例与使用者的关系界限不明确,后期维护也非常麻烦。
    - 难以追踪测试:因为单例模式与 app 拥有同样的生命周期而生命周期内进行的任意修改,所以无法确保一个干净的实例用于测试。
    - 由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
    - 单例类的职责过重,在一定程度上违背了 “单一职责原则”。
    #单例的实现
    在网上看了很多,目前最简单也是最有效的一种
    ##全局变量方法(“单行单例”方法)
    ```
    class SingletonOne {
        static let sharedInstance = SingletonOne()
        private init() {} 
        //切记私有化初始化方法,防止外部通过init直接创建实例。
    }
    ```
    当有继承其他类时,用override来重写init方法
    ##可以通过下面的方式在获得实例前做些设置工作。
    ```
    class SingletonTwo {
        class var sharedInstance: SingletonTwo {
        let instance = SingletonTwo()
        //setup code
        //...
            return instance
        }
    }
    ```
    以上就是我对swift单例的一些总结,关于正确性。这篇文章已经给出
    [http://www.cocoachina.com/swift/20151207/14584.html](http://www.cocoachina.com/swift/20151207/14584.html)
    参考资料
    [http://www.cocoachina.com/swift/20151207/14584.html](http://www.cocoachina.com/swift/20151207/14584.html)
    [https://www.jb51.net/article/127687.htm](https://www.jb51.net/article/127687.htm)
    展开全文
  • swift单利创建 2018-10-29 10:35:50
    几中单利创建方式:https://www.jianshu.com/p/230cc900948c //单利的类 import UIKit   class LYBsingle: NSObject {  @objc var paraone:String?//单利的属性  internal static let instance = ...
  • Swift3 单例模式 2017-06-14 10:05:06
    常见的有这么几种方法 第一种简单到爆的 final class Single: NSObject { static let shared = Single() private override init() {} } final关键字的作用是这个类或方法不希望被继承和重写 第二种 ...
  • swift 单利创建的几种方式 2016-07-01 11:46:05
    swift singleton 创建方式
  • OC和Swift中的简单的单例 2017-01-24 18:06:52
    OC 和 Swift 中的简单单例的创建方式...
  • Swift创建了这样的一个单例 @objc open class Danli: NSObject { static let swiftSharedInstance = Danli() //在oc中这样写才能被调用 @objc open class func sharedInstance() -> Danli { ...
  • Swift是一门新的语言,每一门语言都有其特点,如何在Swift下实现单例设计模式呢?
  • OC 调用 Swift 方法 2018-09-06 11:47:34
    1.新建Swift文件之前做以下设置 2.创建Swift文件后,会提示创建桥接文件,点击创建 3.Swift 类 import Foundation class RealmManager: NSObject { override init() { super.init() } @objc func ...
  • Swift 实现单例类 2019-08-26 13:38:13
    Swift创建单例类总体来说可以使用两种方法,将单例对象声明为类型常量,或者使用GCD方法实现。 声明为类型常量 class SingletonClass1 { static let shared = SingletonClass1() private init() {} /...
  • swift 单例模式的实现 2019-05-07 14:01:35
    第一种单例实现 import Foundation class HttpNetWork: NSObject{ ... //切记私有化初始化方法,防止外部通过init直接创建实例。 private override init() { } } 最简单明了,静态常量 , ...
  • swift4--单例模式的使用 2018-08-19 12:36:34
    首先创建一个新的快捷文件 import Foundation //创建一个单例类 //如果一个类始终只能创建一个实例,则这个类被称为单例类 class Singleton{ // 给类添加一个属性 var action = "Run" // 对于单例实例...
  • 单利创建 iOS 2016-02-18 17:32:44
    单例模式 至于什么是单例模式,我也不多说,我只说说一般怎么实现。在 Objective-C 中,实现单例的方法已经很具体了,虽然有别的方法,但是一般都是用一个标准的方法了,下面来看看。 OBJECTIVE-C ...
  • Swift单例模式 2019-01-01 21:59:18
    转自... 大概分两种: 1.继承自 NSObject的 class SingletonClass: NSObject { static let shared = SingletonClass() // Make sure the class has only one instance ......
  • Swift 中单例模式的替换 2019-02-28 11:24:40
    Cover 除了 MVC、MVVM 之外,单例模式可以说是 iOS 开发中另一常见的设计模式。无论是 UIKit 或是一些流行的三方库,我们都能看到单例的身影。而我们开发者本身也会潜意识地将这些类库中的代码当作最佳实践并将其...
  • 最近抽风 粗略撸了几天的swift基础资料, 新项目就用swift写的.基本上是解决一个问题又碰到一个问题. 走到哪儿卡到哪儿 关于单例OC没什么好说的 . 度娘搜了下swift的单例,无外乎抄来抄去. 当然讲的讲的也挺好. ...
  • 本文由CocoaChina译者leon(社区ID)翻译自krakendev 原文:THE RIGHT WAY TO WRITE A SINGLETON ...使用Swift时,有许多方法实现单例,这是个麻烦事,因为我们不知道哪个最合适。这里我们来回顾一
  • 八、实用进阶1.Swift语言中的两种单利模式//单例模式可以保证一个类仅有一个实例。import UIKit//final修饰符:可以防止类被继承,还可以防止子类重写父类的属性、方法以及下标。该修饰符不能修饰结构体和枚举。...
  • #import "Person.h" static Person *_instance; @implementation Person /** Person单例 */ + (instancetype)sharedPerson { static dispatch_once_t onceToken;... dispatch_once(&onceToken, ^{ ...
1 2 3 4 5 6
收藏数 107
精华内容 42