一. 單例模式簡介:
首先我們應(yīng)該明白,我們每個項目中AppDelegate就是一個完美的單例.
(1)在程序運行過程中,單例只有一個實例對象,而且該實例易于供外界訪問,從而方便控制了實例個數(shù),節(jié)約資源.
(2)單例一般用于工具類,在整個應(yīng)用程序中,字需要初始化一次,就可以共享一份資源.
(3)單例模式因為控制了實例化過程,所以累哦可以更加靈活實例化過程.
(4)單例對象一但被建立起來,對象指針被保留在靜態(tài)區(qū),在堆中分配的內(nèi)存空間,不會自動釋放,只有在程序終止,即殺死APP才會被釋放.
(5)單例類無法實現(xiàn)OC的繼承特性,因為使用繼承,同事也會繼承靜態(tài)變量,而子類和父類同時創(chuàng)建的時候只會創(chuàng)建一個先創(chuàng)建的實例對象,因此一般不做類的擴展.
(6)單例可用來傳值.
注:如果同一類型的對象總是要在不同是用例場景發(fā)生變化,單例就會引起數(shù)據(jù)的錯誤,不能保存彼此的狀態(tài).我們在使用單例類之前,一定要考慮好單例類是否適合類以后的擴展性,避免盲目濫用單例.
二.單例的代碼實現(xiàn):
單例都是繼承于NSObject,首先,聲明初始化方法
Singleton.h
@interface Singleton : NSObject
+(instancetype) shareInstance ;
@end
單例的實現(xiàn)方法有很多種,例如:
#import "Singleton.h"
static Singleton *instance = nil;
@implementtation Singleton
+(instancetype) shareInstance{
/// 1. GCD 最簡單,常用的方法,很方便
static dispath_once_t onceToken;
dispath_once(&onceToken, ^{
if (instance == nil) {
instance = [[self alloc] init];
// 或 instance = [[Singleton alloc] init];
}
});
return instance;
// 返回值的類型可以是id,instancetype,或者類名(Singleton),不過要與聲明保持一致.
// 2. 線程鎖,(GCD是線程封裝)
@synchronized (self) {
// 為了防止多線程同時訪問對象, 造成多次分配內(nèi)存空間, 所以要加上縣城鎖
if (instance == nil) {
instance = [[self alloc] init];
}
return instance;
}
}
@end
調(diào)用很簡單[Singleton shareInstance]獲取單例對象,做自己想干的事就好了.
單例很重要,用起來很方便,但并不難,這些在簡單項目中足夠了,