在一個(gè)ios應(yīng)用中,有時(shí)候我們只需要某個(gè)類的一個(gè)實(shí)例座韵。即是在整個(gè)項(xiàng)目中,這個(gè)類的對象只能被初始化一次踢京。
例如誉碴,當(dāng)應(yīng)用程序啟動(dòng)時(shí),應(yīng)用的狀態(tài)由UIApplication類的一個(gè)實(shí)例維護(hù)漱挚,這個(gè)實(shí)例則代表了整個(gè)"應(yīng)用程序?qū)ο?翔烁,它只能是一個(gè)實(shí)例,其作用是實(shí)現(xiàn)整個(gè)應(yīng)用程序中一些共享資源的訪問和狀態(tài)的保持等旨涝。
說通俗點(diǎn)蹬屹,通常代表一些物理設(shè)備,比如打印機(jī)白华】或是某種不可以有多個(gè)實(shí)例同時(shí)存在的虛擬資源或是系統(tǒng)屬性比如一個(gè)程序的某個(gè)引擎或是數(shù)據(jù)。用單例模式加以控制是非常有必要的弧腥。
OS中好幾個(gè)類都是采用了單例模式厦取,比如NSApplication, NSFontManager,? NSDocumentController,NSHelpManager, NSNull,NSProcessInfo, NSScriptExecutionContext,? NSUserDefaults管搪。
OC實(shí)現(xiàn)原理:
//Singleton.h
@interface Singleton:NSObject
+(Singleton *)sharedManager;
@property ?(nonatomic,strong)NSString *singletonData;
@end
//Singleton.m
#import"Singleton.h"
@implementation Singleton
@sysnthesize singletonData=_singletonData;
static Singleton *sharedManager=nil;
+(Singleton *)sharedManager {
static dispatch_once_t_once;
dispatch_once(&once,^{
? ? ? ?sharedManager=[[]self alloc]init];
});
return sharedManager;
}
@end
上面用了GCD技術(shù)虾攻,作用是在整個(gè)應(yīng)用生命周期中只執(zhí)行一次代碼塊^{......}。使用時(shí)需要將GCD地址傳給dispatch_oce函數(shù)更鲁。dispatch_once函數(shù)能夠記錄該代碼塊是否被調(diào)用過霎箍。
dispatch_once函數(shù)不僅意味著代碼僅會被運(yùn)行一次,而且還意味著此運(yùn)行還是線程同步澡为。也就是說漂坏,當(dāng)我們使用dispatch_once函數(shù)時(shí),就不要需要使用@synchronized之類的語句媒至。
Swift實(shí)現(xiàn)原理
import Foundation
class Singleton {
? class var sharedInstance:Singleton { //靜態(tài)計(jì)算屬性
? ? ? ?struct Static { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //定義結(jié)構(gòu)體
? ? ? ? ? static var instance:Singleton? ? ? //定義靜態(tài)屬性instance 用來保存singleton的子單例對象
? ? ? ? ?static var token:dispatch_once_t=0 ? //定義靜態(tài)屬性token,是dispatch_once_t的類型
}
? ? ?dispatch_once(&Static.token) ?{ ? ? ? ? ?//傳地址給dispatch_once .記錄該代碼塊是否被調(diào)用過顶别。同時(shí)意味著線程同步。
? ? Static.instance=Singleton() ? ? ? ? ? ? ? ? //實(shí)例化Singleton對象
}
return Static.instance! ? ? ? ? ? ? ? ? ? //返回實(shí)例
}
}
swift設(shè)計(jì)單例模式非常靈活拒啰,有非常多的方式驯绎。上面是考慮線程安全的單例模式。
有錯(cuò)誤之處還望大神指正谋旦,交流条篷。