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