单例模式是设计模式中最简单的一种,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象。在我们学习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
网友评论