標籤:
單例模式是日常開發工作中經常會用到的一種設計模式。通過單例模式,可以保證程式中的一個類只有一個執行個體,從而方便對執行個體個數的控制以節省系統資源。因此,如果希望系統中的某個類只有一個執行個體,那單例模式是比較好的解決方案。
iOS開發中,最常見的單例就是UIApplication。
簡單介紹一下iOS中如何?單例設計模式。
在iOS中,所有對象記憶體空間的分配,最終都會調用 allocWithZone方法。也就是說,當我們寫下如下代碼時:
UIButton *btn = [[UIButton alloc] init];
實際上會調用 allocWithZone 方法。因此實現單例時,可以重寫 allocWithZone 方法。
另外,GCD 提供了一個方法,是專門用來建立單例的。提供的是 dispatch_once 宏。可以保證塊代碼中的指令只被執行一次,且多線程時,是安全執行緒的,類只會被執行個體化一次。
重寫 allocWithZone 方法的代碼:
//重寫allocWithZone方法實現單例//GCD提供了一個方法來建立單例,該方法是安全執行緒的+ (id)allocWithZone:(struct _NSZone *)zone{ static Singleton *instance; //dispatch_once是安全執行緒的,onceToken預設為0 //且dispatch_once 可以保證塊代碼中的指令只被執行一次 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [super allocWithZone:zone]; }); return instance;}
這樣,再執行個體化類對象時,實際上返回的是一個唯一對象。
為了方便外界訪問該執行個體,可以實現一個 shared***方法,返回該類的執行個體,代碼如下:
+ (instancetype)sharedSingleton{ return [[self alloc] init];}
驗證代碼如下:
- (void)viewDidLoad { [super viewDidLoad]; Singleton *single = [[Singleton alloc] init]; NSLog(@"single = %@",single); Singleton *single2 = [Singleton sharedSingleton]; NSLog(@"single2 = %@",single2); for(int i = 0; i < 10; ++i){ Singleton *testSingle = [[Singleton alloc] init]; NSLog(@"testSingle = %@",testSingle); }}
執行結果:
可以看出,無論是多次 alloc ,還是 shared***,得到的執行個體對象記憶體位址都是一樣的,說明類的執行個體只有一個。
iOS中的單例模式