iOS單例模式
下午幫同事改了一下午的代碼,深深的被刺傷了,也深深的覺得代碼架構的重要性,更深深的覺得應該好好的打磨一下設計模式。於是乎就鑽研一下設計模式由易到難,先從iOS最簡單的單例模式說起。
作為iOS最簡單的設計模式—單例模式,主要的作用是:保證了一個類在項目中只有唯一的執行個體。 節約了資源,減少不必要的開支。
怎樣建立一個單例?
定義一個全域變數:
static Singleton * _instance =nil;
提供一個類方法介面,供外界調用:
+(instancetype)shareInstance{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance =[[super allocWithZone:NULL]init]; }); return _instance;}
重寫系統調用方法
我們執行個體化對象的時候通常會通過alloc、init或者copy的方法,當我們調用alloc方法時,OC內部會調用allocWithZone這個方法來申請記憶體。拷貝對象也是同樣的原理,OC內部調用copyWithZone方法,所以我們需要重寫這兩個方法,從而保證執行個體的單一性:
+(instancetype)allocWithZone:(struct _NSZone *)zone{ return [Singleton shareInstance];}-(instancetype)copyWithZone:(struct _NSZone *)zone{ return [Singleton shareInstance];}
讓我們調用一下:
Singleton *obj1=[Singleton shareInstance]; NSLog(@"obj1=%@",obj1); Singleton *obj2=[Singleton shareInstance]; NSLog(@"obj2=%@",obj2); Singleton *obj3=[[Singleton alloc]init]; NSLog(@"obj3=%@",obj3); Singleton *obj4=[[Singleton alloc]init]; NSLog(@"obj4=%@",[obj4 copy]);
列印結果地址一致就大功告成:
2016-03-04 18:26:00.204 obj1=2016-03-04 18:26:00.205 obj2=2016-03-04 18:26:00.205 obj3=2016-03-04 18:26:00.205 obj4=