什么是單例,為什么要用單例?
1,單例模式:
確保某一個(gè)類只有一個(gè)實(shí)例。單例模式只會(huì)生成一個(gè)對(duì)象。內(nèi)存空間永遠(yuǎn)是一個(gè),保證實(shí)體的唯一性。其他類可以通過全局的入口點(diǎn)對(duì)這個(gè)實(shí)例進(jìn)行訪問。iOS sdk中也有許多類使用了單例模式,例如UIApplication:當(dāng)程序啟動(dòng)時(shí),會(huì)調(diào)用UIApplicationMain方法,在該方法中,會(huì)實(shí)例化一個(gè)UIApplication對(duì)象,之后在程序中的任意地方調(diào)用shareApplication都將返回一個(gè)與當(dāng)前應(yīng)用程序相關(guān)的UIApplication實(shí)例。以及:[NSUserDefaluts standardUserDefaults]也是返回的一個(gè)單例對(duì)象,因?yàn)椴荒茏尣煌膗d對(duì)象去修改文件
2,單例模式的使用:
1,GCD:
+ (MyDataHelper *)shareMyDataHelper {
static MyDataHelper * myDataHelper = nil;
static dispatch_once_t takeOnce;
dispatch_once(&takeOnce,^{
myDataHelper = [self alloc]init];
} );
return myDataHelper;
}
利用GCD,可以保證初始化代碼只實(shí)現(xiàn)一次。前提是takeonce指針也必須是全局或者靜態(tài)變量。
因?yàn)閟tatic 修飾的成員變量只會(huì)初始化一次,如果不聲明為靜態(tài)變量,那么每次進(jìn)來,都會(huì)重置變量為nil,那么就會(huì)重新創(chuàng)建對(duì)象。
2,重寫init,alloc方法,
1)先寫一個(gè)創(chuàng)建單例的方法
static MyDataHelper * myDataHelper = nil;
+ (MyDataHelper *)shareMyDataHelper {
@synchronized(self)
{
if (myDataHelper == nil)
{
[self alloc]init];
}
return myDataHelper;
}
+ (id)allocWithZone:(NSZone *)zone//在alloc分配內(nèi)存空間的時(shí)候,是調(diào)用的allocWithZone分配空間
{
@synchronized(self){
if (myDataHelper == nil)
{
myDataHelper = [super allocWithZone:zone];
return myDataHelper;
}
}
return nil;
}
-(id)init {
@synchronized(self){
if( self ==[super init])
{
//初始化
}
return self;
}
- (id)copyWithZone:(NSZone *)zone{
return self;
}
以下是非ARC模式下需要添加的
-(unsigned)retainCount{
return 1// 永遠(yuǎn)到返回1
}
- (oneway void)release {
釋放的時(shí)候什么也不做 }
(oneway 修飾符)表示此操作是單項(xiàng)的,這樣做意味著方法就算返回了什么,調(diào)用者也拿不到這個(gè)方法
如果需要實(shí)現(xiàn)單例的多態(tài),就拿到單例對(duì)象之后,重新進(jìn)行初始化就行。