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