在軟件工程中,單例是一種用于實(shí)現(xiàn)單例的數(shù)學(xué)概念, 既將類的實(shí)例化僅限制成一個(gè)對(duì)象的一種設(shè)計(jì)模式.或者我們可以簡(jiǎn)單地將它理解為一個(gè)類,只能實(shí)例化一個(gè)對(duì)象的類.在我們IOS工程中,UiApplication 中至少有一個(gè)單例模式的存在;
比如: [UIApplication sharedApplication] 這樣就可以在工程里調(diào)這個(gè)單例;
單例模式的作用 :可以保證在程序運(yùn)行過(guò)程甲献,一個(gè)類只有一個(gè)實(shí)例粟矿,而且該實(shí)例易于供外界訪問(wèn),從而方便地控制了實(shí)例個(gè)數(shù)袁勺,并節(jié)約系統(tǒng)資源。
單例模式的使用場(chǎng)合:在整個(gè)應(yīng)用程序中起惕,共享一份資源(這份資源只需要?jiǎng)?chuàng)建初始化1次)摔敛,應(yīng)該讓這個(gè)類創(chuàng)建出來(lái)的對(duì)象永遠(yuǎn)只有一個(gè)。
對(duì)于目前單例模式的最佳方式,就是GCD出來(lái)以后我們所引用的dispatch_once函數(shù)創(chuàng)建的單例;
dispatch_once函數(shù),接收一個(gè)dispatch_once用于檢查該對(duì)象是否已經(jīng)被調(diào)用,它還接收一個(gè)希望在應(yīng)用的生命周期中只能被調(diào)用一次的代碼塊,這就是單例的實(shí)例化要的;
dispatch_once函數(shù)還有一個(gè)好處,就是線程安全問(wèn)題,使用dispatch_once函數(shù),這就意味著你不用再去給單例加@synchronized,也稱給單例加鎖;關(guān)于線程安全為題,個(gè)人理解:給單例對(duì)象之所以要加鎖,是應(yīng)為系統(tǒng)對(duì)于單例對(duì)象的內(nèi)存申請(qǐng)是在堆區(qū),而不是棧區(qū),而我們?cè)谡{(diào)用的時(shí)候一般是在棧區(qū)去執(zhí)行它,也就是說(shuō)每一個(gè)線程都可以調(diào)用它,而我們知道堆區(qū)的內(nèi)存是有共享性的,為了保證單例對(duì)象的唯一性,避免不會(huì)在同一時(shí)間被調(diào)用,我們給他采用的加鎖;
代碼演示:
.h中
#import@interface Model : NSObject
//單例
+ (instancetype)sharedHandel;
#import "Model.h"
@implementation Model
.m中方法的實(shí)現(xiàn)
+ (instancetype)sharedHandel
{
static Model *model = nil;
static dispatch_once_t OnceToken;
dispatch_once(&OnceToken, ^{
model = [[Model alloc] init];
});
return model;
}
@end