什么是單例 ?
單例模式是一種常用的軟件設(shè)計(jì)模式。在它的核心結(jié)構(gòu)中只包含一個(gè)被稱為單例類的特殊類。通過單例模式可以保證系統(tǒng)中一個(gè)類只有一個(gè)實(shí)例而且該實(shí)例易于外界訪問,從而方便對實(shí)例個(gè)數(shù)的控制并節(jié)約系統(tǒng)資源。如果希望在系統(tǒng)中某個(gè)類的對象只能存在一個(gè),單例模式是最好的解決方案。
iOS開發(fā)中如何使用單例?
傳統(tǒng)的單例構(gòu)造方法
+ (id)sharedInstance {
static id sharedInstance;
if(sharedInstance == nil){
sharedInstance = [[]self alloc] init]
}
return sharedInstance;
}
多線程下的隱患 在多線程的情況下,如果兩個(gè)線程幾乎同時(shí)調(diào)用sharedInstance()方法會(huì)發(fā)生什么呢?
有可能會(huì)創(chuàng)建出兩個(gè)該類的實(shí)例。
為了防止這種情況 我們通常會(huì)加上鎖
+ (id)sharedInstance {
static id sharedInstance;
@synchronized(self)
if(sharedInstance == nil)
{ sharedInstance = [[]self alloc] init]
} }
return sharedInstance;
}
dispatch_once iOS 4.0 引進(jìn)了 GCD ,其中的 **dispatchonce**,它即使是在多線程環(huán)境中也能安全地工作,非常安全。dispatchonce是用來確保指定的任務(wù)將在應(yīng)用的生命周期期間,僅執(zhí)行一次。以下是一個(gè)典型的源代碼以初始化的東西。它可以優(yōu)雅通過使用dispatch_once來創(chuàng)建一個(gè)單例。
+ (id)sharedInstance {
static dispatch_once_t once;
static id sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init]; });
return sharedInstance;
}