单例 :通常应用在 网络工具、音频工具安全
OC中单例写法: 网络
+ (instancetype)sharedTools {多线程
static id instance; //存储在静态区函数
static dispatch_once_t onceToken; // dispatch_once_t 长整型 若是 onceToken 为0,就执行block中的代码, 只执行一次(一次性执行)工具
dispatch_once(&onceToken, ^{spa
instance = [[self alloc] init]; //dispatch_once 只是对这句代码加锁,保证block中的代码只执行一次.net
});线程
return instance;3d
}code
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 之类的来防止使用多个线程或者队列时不一样步的问题。