什么是單例 瞳腌?
單例模式是一種常用的軟件設(shè)計模式。在它的核心結(jié)構(gòu)中只包含一個被稱為單例類的特殊類镜雨。通過單例模式可以保證系統(tǒng)中一個類只有一個實例而且該實例易于外界訪問嫂侍,從而方便對實例個數(shù)的控制并節(jié)約系統(tǒng)資源。如果希望在系統(tǒng)中某個類的對象只能存在一個,單例模式是最好的解決方案挑宠。
iOS開發(fā)中如何使用單例菲盾?
傳統(tǒng)的單例構(gòu)造方法
+ (id)sharedInstance {
static id sharedInstance;
if(sharedInstance == nil){
sharedInstance = [[]self alloc] init]
}
return sharedInstance;
}
多線程下的隱患 在多線程的情況下,如果兩個線程幾乎同時調(diào)用sharedInstance()方法會發(fā)生什么呢各淀?
有可能會創(chuàng)建出兩個該類的實例懒鉴。
為了防止這種情況 我們通常會加上鎖
+ (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í)行一次悉默。以下是一個典型的源代碼以初始化的東西。它可以優(yōu)雅通過使用dispatch_once來創(chuàng)建一個單例苟穆。
+ (id)sharedInstance {
static dispatch_once_t once;
static id sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init]; });
return sharedInstance;
}