標籤:style blog class code java javascript color http rgb com type
單例模式是一種常見的軟體設計模式。
通過單例模式可以保證系統中一個類只有一個執行個體而且該執行個體易於外界訪問,從而方便對執行個體個數的控制並節約系統資源。
如果希望系統中某個類的對象只能存在一個,單例模式是最好的解決反感。
IOS中最常見的單例就是UIApplication
單例的實現步驟:
1.重寫allocWithZone方法
allocWithZone方法是對象分配記憶體空間時,最終會調用的方法,重寫該方法,保證只會分配個記憶體空間。
2.建立shaerdXXX類方法,便於其他類調用
+ (id)allocWithZone:(struct _NSZone *)zone{ static DemoObj *instance; // dispatch_once是安全執行緒的,onceToken預設為0 static dispatch_once_t onceToken; // dispatch_once宏可以保證塊代碼中的指令只被執行一次 dispatch_once(&onceToken, ^{ // 在多線程環境下,永遠只會被執行一次,instance只會被執行個體化一次 instance = [super allocWithZone:zone]; }); return instance;}+ (instancetype)sharedDemoObj{ return [[self alloc] init];}
還有一種常見的單例建立方式:
static DemoObj *instance;+ (instancetype)sharedDemoObj{ // 如果有兩個線程同時執行個體化,很有可能建立出兩個執行個體來 if (!instance) { // thread 1 0x0000A // thread 2 0x0000B instance = [[self alloc] init]; } // 第一個線程返回的指標已經被修改!}
但是[[DemoObj alloc] init] 和[DemoObj sharedDemoObj]執行個體化的對象的記憶體位址是不一樣的,還有就是線程不安全。