在學習的過程當中一致對單例模式瞭解的不是很清楚,今天看到一個博主的文章,感受略微通透了一些,在此總結一下。ios
單例模式是一個類在系統中只有一個實例對象,它在整個程序的生命週期中只有一分內存,能夠在多個程序中實現數據共享。安全
爲了不在多線程中在多個程序中同時調用,從而致使單例中數據的不許確性。經過線程加鎖,排隊執行的方式(@synchronized)或者gcd的方式 -- 經過全局的一個入口點對這個實例對象進行訪問(以下圖)。由於若是多線程的執行時,可能不一樣線程同時訪問單例時,在短暫的時間片的執行過程當中,兩個線程同時進入單例,就會就會致使線程不安全性。多線程
單例像一個獨裁者,全部的數據訪問和請求都的通過它,來確保全局只有一個對象的實例存在。學術說法是,單例模式,爲某一類需求和數據提供了統一的程序接口。學習
ios中單例的實現(arc模式下):spa
不考慮線程安全:線程
static SingleCase *manager = nil; + (SingleCase *)defaultManager { if (!manager){ SingleCase = [[self alloc] init]; return manager; } }
考慮線程安全:code
//線程加鎖 +(Humen *)shared { @synchronized(self) { if (hm == nil) { hm = [[Humen alloc]init]; } } return hm; }
dispatch_once方法的做用就是執行且在整個程序的生命週期中,僅執行一次某一個block對象。 該方法是線程安全的,因此請放心大膽的在子線程中使用。(前提是你的dispatch_once_t *onceToken對象必須是全局或者靜態對象。這一點很重要,若是不能保證這一點,也就不能保證該方法只會被執行一次。)對象
@implementation DZSinglonARC + (DZSinglonARC*) shareInstance { static DZSinglonARC* share = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ share = [[self alloc] init]; }); return share; }@end