iOS swift和OC 中单例写法

2019-02-26  本文已影响9人  9岁就很6
单例模式是设计模式中最简单的一种,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象。在我们学习OC的时候写法都比较麻烦,笔者刚接触swift不久,可以说从3.0学会到重学😄,如今4.0出来了,简单复习一下,下面我给大家做给一个对比,
单例
一、OC单例的创建模式

创建单例最初的学习到的写法是判断对象是否为空,为空才创建,但这仅仅是单线程安全,为了多线程安全,创建单例时会加锁,写法如下

+ (instancetype)shareManager{
    @synchronized(self){
        if (!manager) {
            manager = [[self alloc]init];
        }
        return manager;
    }
}

后来发现GCD创建单例更加简便,此时OC中的单例就已经写好了,只要我们在外面调用shareManager这个方法,返回的对象始终是一个,因为dispatch_once只执行一次。

static DataManager *manager = nil;

@implementation DataManager

+ (instancetype)shareManager{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[self alloc] init];
    });
    return manager;
}

//重写  以下几个方法,一个完整的单例创建就完成啦~~~
+ (id)allocWithZone:(struct _NSZone *)zone{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [super allocWithZone:zone];
    });
    return manager;
}
- (nonnull id)copyWithZone:(nullable NSZone *)zone {
    return manager;
}

- (nonnull id)mutableCopyWithZone:(nullable NSZone *)zone {
    return manager;
}
@end
二、swift单例的创建模式

1、一句话搞定,静态常理。所有地方用到的都是同一个

import Foundation

class SingleOne {
    
    //单例
    static let shared = SingleOne()
    
}

2、使用dispatch_once可以保证其中的代码只执行一次

import Foundation

class SingleTwo {
    
    //单例
    class func shared()->SingleTwo{
        struct Singleton{
            static var onceToken : dispatch_once_t = 0
            static var single:SingleTwo?
        }
        dispatch_once(&Singleton.onceToken,{
            Singleton.single=shareSingleTwo()
        }
        )
        return Singleton.single!
    }
    
}

3、全局常量写法

import Foundation

//全局的常量
let single = SingleThree()

class SingleThree {

    class var shared : SingleThree {
        return single
    }
}

4、

import Foundation

class SingleFour {
    
    static var shared : SingleFour {
        struct Static {
            static let instance : SingleFour = SingleFour()
        }
        return Static.instance
    }
}

喜欢就点个赞吧✌️✌️
有错之处,还请指出,感谢🙏🙏 欢迎加入我的iOS进阶群425234485

上一篇 下一篇

猜你喜欢

热点阅读