1. 簡(jiǎn)介
本文借鑒了一位大神的文章,大神。
單例的作用是在整個(gè)程序中,一個(gè)類只有一個(gè)實(shí)例,常見(jiàn)于播放器,管理類。
優(yōu)點(diǎn):
單例模式可以保證系統(tǒng)中一個(gè)類只有一個(gè)實(shí)例而且該實(shí)例易于外界訪問(wèn),從而方便對(duì)實(shí)例個(gè)數(shù)的控制并節(jié)約系統(tǒng)資源。
如果希望在系統(tǒng)中某個(gè)類的對(duì)象只能存在一個(gè),單例模式是最好的解決方案。
單例模式因?yàn)轭惪刂屏藢?shí)例化過(guò)程,所以類可以更加靈活修改實(shí)例化過(guò)程。
缺點(diǎn):
單例對(duì)象一旦建立,對(duì)象指針是保存在靜態(tài)區(qū)的,單例對(duì)象在堆中分配的內(nèi)存空間,會(huì)在應(yīng)用程序終止后才會(huì)被釋放。
單例類無(wú)法繼承,因此很難進(jìn)行類的擴(kuò)展。
單例不適用于變化的對(duì)象,如果同一類型的對(duì)象總是要在不同的用例場(chǎng)景發(fā)生變化,單例就會(huì)引起數(shù)據(jù)的錯(cuò)誤,不能保存彼此的狀態(tài)。
2. 基本使用
首先,創(chuàng)建一個(gè)Singleton類
然后聲明一個(gè)靜態(tài)變量,并重寫代理的初始化方法。
static Singleton *singleton;
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (singleton == nil) {
singleton = [[Singleton alloc] init];
}
});
return singleton;
}
然后命名為share開頭的方法,這樣單例的初始化方法就創(chuàng)建完了
+ (instancetype)shareSingleton
{
return [[self alloc] init];
}
當(dāng)然,以下兩個(gè)方法也需要重寫,因?yàn)檫@兩個(gè)方法也會(huì)創(chuàng)建新實(shí)例變量
-(id)copyWithZone:(NSZone *)zone
{
return singleton;
}
-(id)mutableCopyWithZone:(NSZone *)zone
{
return singleton;
}
3. 最后附上MRC和ARC共用的單例宏定義。
#define singleH(name) +(instancetype)share##name;
#if __has_feature(objc_arc)
#define singleM(name) static id _instance;\
+(instancetype)allocWithZone:(struct _NSZone *)zone\
{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [super allocWithZone:zone];\
});\
return _instance;\
}\
\
+(instancetype)share##name\
{\
return [[self alloc]init];\
}\
-(id)copyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
\
-(id)mutableCopyWithZone:(NSZone *)zone\
{\
return _instance;\
}
#else
#define singleM static id _instance;\
+(instancetype)allocWithZone:(struct _NSZone *)zone\
{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [super allocWithZone:zone];\
});\
return _instance;\
}\
\
+(instancetype)shareTools\
{\
return [[self alloc]init];\
}\
-(id)copyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
-(id)mutableCopyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
-(oneway void)release\
{\
}\
\
-(instancetype)retain\
{\
return _instance;\
}\
\
-(NSUInteger)retainCount\
{\
return MAXFLOAT;\
}
#endif
結(jié)語(yǔ):限于水平,本文只寫了一些基本用法和注意事項(xiàng),如果文中存在錯(cuò)誤請(qǐng)指出,我會(huì)及時(shí)修改。