单例 :一般应用在 网络工具、音频工具
OC中单例写法:
+ (instancetype)sharedTools {
static id instance; //存储在静态区
static dispatch_once_t onceToken; // dispatch_once_t 长整型 如果 onceToken 为0,就执行block中的代码, 只执行一次(一次性执行)
dispatch_once(&onceToken, ^{
instance = [[self alloc] init]; //dispatch_once 只是对这句代码加锁,保证block中的代码只执行一次
});
return instance;
}
Swift中单例写法:
法一:
// 以下代码仿 OC 的写法!
// 在 Swift 中不允许在函数中定义静态成员
static var instance: SoundTools?
static var onceToken: dispatch_once_t = 0
// 1. 提供全局的访问点
class func sharedTools() -> SoundTools { // class func类函数 //func 函数
dispatch_once(&onceToken) { () -> Void in
instance = SoundTools()
}
return instance! //解包
}
法二:
// 静态区的对象只能设置一次数值
static let sharedTools = SoundTools()
法三:
// Swift 中的的单例写法和懒加载几乎一样 `static let`
// 同样也是在第一次使用时,才会创建对象
static let sharedTools: SoundTools = {
print("创建声音对象")
return SoundTools()
}()
附:
iOS4版本之前
static SingleClassManager *singleManager = nil;
+(SingleClassManager*)sharedManager
{
@synchronized(self) //同步加锁,在多线程中使用,可以使线程安全
{
if(singleManager == nil)
{
singleManager = [[SingleClassManager alloc]init];
}
}
return singleManager;
}
iOS5版本开始(block函数)
+ (DSLocationManager *)shareInstance{
static DSLocationManager *manager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[DSLocationManager alloc]init];
});
return manager;
}
该方法有很多优势:
1 线程安全
2 很好满足静态分析器要求
3 和自动引用计数(ARC)兼容
4 仅需要少量代码
说明:
该函数接收一个dispatch_once用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上作为BOOL使用)。它还接收一个希望在应用的生命周期内仅被调度一次的代码块,对于本例就用于shared实例的实例化。
dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如@synchronized 之类的来防止使用多个线程或者队列时不同步的问题。