首页计算机应用 › iOS开发中的设计模式,IOS开发之单例设计模式

iOS开发中的设计模式,IOS开发之单例设计模式

iOS--斯维夫特开辟中的单例设计格局

新近在支付三个小的选取,遇到了有的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  {

    ...

iOS开发中的设计模式,IOS开发之单例设计模式。}

亮点:代码最精简。

 

缺陷:代码开放度较乱

 

 

 

第二种就弥补了地点的劣点

 

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格局在Swift中也是支撑的,比较上一种办法,这种方法很扎眼未有另外优势,然而照旧写出来啊

 

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!

    }

}

(原理同样,还是用struct援助项目变量这一优势,来把OC的dispatch_once形式平移过来,参谋:

 

总的来讲,苹果官方已经断定宣示延迟起初化是线程安全的,所以,没有须要再加一层dispatch_once也许类似的珍贵措施。

 

全局变量(struct和enum内部的静态成员也如出一辙)的推迟加载本质是dispatch_once,因此只要想选用dispatch_once,不及间接声喜宝个私人民居房全局变量,即确定保证了线程安全,也不会使代码过于open

近年来在支付几个小的接纳,遭遇了部分Objective-c上面常用的单例方式,但是swift下边照旧有自然差距的,反...

iOS开荒中有很各种设计格局,那篇小说写的是单例方式,别的设计形式后续会更新。。。

IOS开拓之单例设计形式,IOS开辟之设计方式

本文将从八个方面对IOS开辟中的单例设计情势进行教学:

一、什么是单例设计模式
二、我们为什么要用单例设计模式
三、单例设计模式的基本用法
四、自定义单例设计模式代码的封装 

 

先来拜望百度百科中对单例形式的定义:

一、什么是单例设计形式

  所谓单例,便是单个的实例化对象,保障三个类有且只有二个实例。日常状态下,当我们对七个类实例化时(如:alloc、new等)并无法保证每一回实例化的指标是独一的实例。那么为了确认保证此类可在一再实例化的历程中保障内部存储器地址不改变,就供给引进单例设计格局。

 


 

单例情势是设计格局中最简便易行的方式之一。这一情势的指标是驱动类的三个对象形成系统中的独一实例。要落到实处那点,能够从客户端对其展开实例化开首。因而须求用一种只允许生成对象类的独一实例的建制,“阻止”全数想要生成对象的拜访。使用工厂方法来限制实例化进程。那么些方式应该是静态方法,因为让类的实例去变通另四个独一实例毫无意义。

二、大家怎么要用单例设计形式

1、Singleton 会阻止其余对象实例化其本人的 Singleton
对象的别本,进而保障全部目的都访谈独一实例,如手提式有线电话机中有五个音乐播放器,但供给为用户播放最后展开的播放器中的音乐,为增长用户体验,这种播放工具类就需求用单例来促成。

2、可拉长线程安全,在实例化单例时大家用到了贰个dispatch_once函数

void dispatch_once(

    dispatch_once_t *predicate,

    dispatch_block_t block);

该函数在任何程序的阐明周期中,仅实践贰次某叁个block对象,系统现已帮大家加了锁,所以在几个线程抢夺同一财富的时候,他也是安枕无忧的

 


 

1.首先句话表达了单例是一种设计方式,有好两个人在面试被问到单例时日常说:单例是贰个对象,它在程序运维中是独一的。那是把单例的概念和功用混淆了,它的职能是保障程序运维进度中指标的独一性,所以那一点要求细心。

三、单例设计情势的大旨用法

一般来讲状态下,一般的单例设计格局只须求重写三个艺术就能够,当然需求用于实例化对象的share或standard的类形式是需求的。

+ (id)allocWithZone:(NSZone *)zone;
// IOS9.0之后不需要引入NSCopying对copyWithZone方法重写也不会报错
- (id)copyWithZone:(NSZone *)zone;

 

贯彻单例的类措施:

static id _instance;

+ (instancetype)shareAudioPlayer {
    /**
     一次性执行
     dispatch_once是安全的,系统已经帮我们加了锁,所以在多个线程抢夺同一资源的时候,他也是安全的
     */
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSLog(@"---once---");

        _instance = [[self alloc] init];
    });

    return _instance;
}

 

对以上五个主意的重写

+ (instancetype)allocWithZone:(struct _NSZone *)zone {

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [super allocWithZone:zone];
    });
    return _instance;

}

- (id)copyWithZone:(NSZone *)zone {
    return _instance;
}

 

单例设计格局在ARC与非ARC下的中间机制后有一对不一,上面大家分别就二种内存管理格局对单例设计形式进行认证。

只要在ARC下,上面包车型客车代码便丰硕达成单例设计形式,以下代码不需重写。

 

设若在MRC下,则在重写以上七个方式的底子上,还要对上面包车型客车多少个方法实行重写:

- (id)retain;

- (NSUInteger)retainCount;

- (void)release;

- (id)autorelease;

// MRC下还要重写以下方法
- (oneway void)release {}

- (instancetype)retain {return _instance;}

- (instancetype)autorelease {return _instance;}

- (NSUInteger)retainCount {return 1;}

 

如上即为单例设计方式在ARC或MRC下的用法。假若急需同有的时候候包容MRC或ARC就须求对缩写代码实行判定,大家一般用口径编写翻译来举行剖断:

#if __has_feature(objc_arc) // ARC

    NSLog(@"MRC下插入ARC代码也是可以的,在MRC下也不会报错,但不会被执行");

#else  // MRC

    NSLog(@"ARC下插入MRC代码也是可以的,在ARC下也不会报错,但不会被执行");

#endif

 


转载本站文章请注明出处:ca888亚洲城唯一官网 https://www.axypet.com/?p=2297

上一篇:

下一篇:

相关文章