【澳门新萄京8522】iOS–Swift开荒中的单例设计方式

【澳门新萄京8522】iOS–Swift开荒中的单例设计方式

iOS–Swift开辟中的单例设计形式

近些日子在付出四个小的应用,蒙受了有个别Objective-c下面常用的单例情势,可是swift上面如故有肯定不同的,一再倒来倒去发掘无法按常理(符合规律的oc
to
swift的法子)出牌,由此寻觅了一些帖子。大概是xcode只怕sdk的难题吧(作者深信不疑他们不会把未经测验的代码展现,吧?。。。),一些帖子中的代码犯了肯定的一无所长,编译战败。于是有了这篇小说,分享给大家。

 

 

 

最初的著小编实现了一种单例,可是浅蓝代码导致非线程安全:

 

 1 class var sharedInstance:TPScopeManager {

 2     get {

 3         struct Static {

 4             static var instance : TPScopeManager? = nil

 5         }

 6 

 7         if !Static.instance {

 8             Static.instance = TPScopeManager()

 9         }

10 

11         return Static.instance!

12     }

13 }

于是乎有了上边这个化解方案(个人感到很特出):

 

全局常量

 

率先种:直接证明全局变量

 

let _SingletonSharedInstance = Singleton()

 

class Singleton  {

    …

}

亮点:代码最精简。

 

缺欠:代码开放度较乱

 

 

 

其次种就弥补了上边包车型大巴后天不足

 

private let _SingletonSharedInstance = Singleton()

 

class Singleton  {

    class var sharedInstance : Singleton {

        return _SingletonSharedInstance

    }

}

注:因为不支持项目常量(即类的静态常量),所以这里运用了全局常量

 

这种方法帮忙延迟(lasy)初叶化,因为斯维夫特会延迟初步化全局常量(和变量),并且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格局在斯威夫特中也是支撑的,相比上一种艺术,这种措施很显明未有另外优势,可是依旧写出来吗

 

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!

    }

}

 

因而看来,苹果官方已经明显宣示延迟开始化是线程安全的,所以,没有须要再加一层dispatch_once只怕类似的尊崇措施。

 

全局变量(struct和enum内部的静态成员也长久以来)的推移加载本质是dispatch_once,由此一旦想利用dispatch_澳门新萄京8522,once,不及间接声圣元(Synutra)个私人商品房全局变量,即确保了线程安全,也不会使代码过于open

 

自己比较欣赏全局变量格局(当然是经过优化的这种),不用嵌套一层struct,比较精简。我们高兴哪一种啊?

这两天在支付贰个小的选择,遇到了有些Objective-c上面常用的单例情势,可是swift上边还是有一定差别的,反…

//全局的常量

static var onceToken : dispatch_once_t = 0

一句话化解,静态常理。全体地点使用的都以同叁个!

let single = SingleThree()

}

static let instance : SingleFour = SingleFour()

dispatch_once(&Singleton.onceToken,{

class func shareSingleTwo()->SingleTwo{

class func shareSingleTwo()->SingleTwo{

static var single:SingleTwo?

使用dispatch_once能够确认保证内部的代码只进行三回

class SingleThree {

static var single:SingleTwo?

static let shareSingleOne = SingleOne()

单例方式是设计情势中最简便易行的一种,乃至有一些方式大师都不称其为方式,称其为一种达成技术,因为设计格局讲究对象时期的涉及的虚幻,而单例方式独有自身三个目的。

3、

struct Static {

}

static var onceToken : dispatch_once_t = 0

当您只须求二个实例的时候要求选择单例,如UIApplication.sharedApplication()
等 ,windows的职分管理器,回收站 都以只能同一时候存在八个。

}

1、

}

4、

class SingleThree {

}

}

//单例

class SingleFour {

class SingleFour {

3、

struct Static {

澳门新萄京8522 1

//全局的常量

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图