Swift单例模式

Swift单例模式

单例模式

单例模式的作用是解决“应用中只有一个实例”的一类问题。在Cocoa Touch框架中,有UIApplication、NSUserDefaults和NSNotificationCenter等单例类。另外,NSFileManager和NSBundle类虽然属于Cocoa框架的内容,但也可以在Cocoa Touch框架中使用(Cocoa框架中的单例类有NSFileManager、NSWorkspace和NSApplication等)。

很多人都熟悉OC的单例创建的方式,使用NSLock、@synchronized等锁,所用GCD的dispatch-once创建等..
但是Swift作为一个新的语言,跟OC的区别还是蛮大的,
那么怎么私用Swift创建一个单例呢?

单例模式的实现有很多方案,苹果公司在《UsingSwift with Cocoa and Objective-C》官方文档中给出了一种单例模式的实现。最简单形式代码如下:

    class Singleton {  
        static let sharedInstance = Singleton()  
    }  

是的就是这么简单,上述代码采用static的类属性实现单例模式,这种类属性只被延迟加载执行一次,即便是在多线程情况下也只是执行一次,并且保证是线程安全的。
当然这里使用了全局变量而非类变量,是因为不支持类变量

与类不同,结构可以定义静态变量,通过使用此方法,将静态变量升级为类变量(在支持类变量之前,推荐此方法)

class Singleton {
    class var sharedInstance : Singleton {
        struct Static {
            static let instance : Singleton = Singleton()
        }
        return Static.instance
    }
}

如果我们想要有更多的初始化,我么也可以使用闭包的形式创建

    class Singleton {  
        static let sharedInstance: Singleton = {  
              let instance = Singleton()  
              // 初始化处理  
              return instance  
            }()  
    }  

当然很多人会想到dispatch-once,因为OC这样的创建方式已经习惯了,

class Singleton {
    class var sharedInstance : Singleton {
        struct Static {
            static var onceToken : dispatch_once_t = 0
            static var instance : Singleton? = nil
        }
        dispatch_once(&Static.onceToken) {
            Static.instance = Singleton()
        }
        return Static.instance!
    }
}

但是Swift3.0取消了once的实现,
所以我们只能自己来实现.

extension DispatchQueue {
    private static var _onceTracker = [String]()
    public class func once(_ token: String, block:()->Void) {
        objc_sync_enter(self)
        defer { objc_sync_exit(self) }
        
        if _onceTracker.contains(token) {
            return
        }
        _onceTracker.append(token)
        block()
    }
}

那么我们创建的方式一样可以使用once

class Singleton {
        class var sharedInstance : Singleton {
            struct Static {
                static var onceToken = NSUUID().uuidString//可以自定一个值......
                static var instance : Singleton? = nil
            }
            DispatchQueue.once(Static.onceToken) {
                Static.instance = Singleton()
            }
            return Static.instance!
        }
    }

当然单例模式的创建,我只是列举了几个例子,至于在应用中如何使用,使用哪一个,可以根据需求来定....

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 单例模式需要满足 整个程序的生命周期只能存在一个,所以 构造器需要是private, 保证外部无法调用构造器 线程...
    JaiUnChat阅读 3,134评论 0 1
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,667评论 4 61
  • iOS开发中过程中最熟悉的设计模式应该是单例模式,例如NotificationCenter通知中心、Applica...
    FlyElephant阅读 3,021评论 0 0
  • 就在前几天,朋友圈里纷纷扰扰地轰炸『2015过去了,2016要好好的』、『新年快乐,一定要加油』等等。 看到这些言...
    SwingWong阅读 1,837评论 0 0
  • 曾经有一段时间,我很羡慕那些写作大神,他们怎么那么多东西可以写,他们怎么可以懂那么多东西。 直到来到简书,看了几篇...
    西橙L阅读 1,049评论 0 0

友情链接更多精彩内容