單例模式基本用法

在objective-c中要實現一個單例類,至少需要做以下四個步驟:
1、爲單例對象實現一個靜態實例,並初始化,然後設置成nil,
2、實現一個實例構造方法檢查上面聲明的靜態實例是否爲nil,如果是則新建並返回一個本類的實例,
3、重寫allocWithZone方法,用來保證其他人直接使用alloc和init試圖獲得一個新實力的時候不產生一個新實例,
4、適當實現allocWitheZone,copyWithZone,release和autorelease。

而實踐證明,使用alloc方法初始化一個類的實例 的時候,默認是調用了 allocWithZone 的方法。於是覆蓋allocWithZone方法的原因已經很明顯了:爲了保持單例類實例的唯一性,需要覆蓋所有會生成新的實例的方法,如果有人初始化這 個單例類的時候不走[[Class alloc] init] ,而是直接 allocWithZone, 那麼這個單例就不再是單例了,所以必須把這個方法也堵上。
那麼下面我們看看如何正確定義一個單例類:
static DataModel *_sharedDataModel=nil; //第一步:靜態實例,並初始化

@implementation DataModel

+(DataModel *)sharedDataModel //第二步:實例構造檢查靜態實例是否爲nil
{
//確保線程安全
@synchronized(self)
{
if (_sharedDataModelnil)
{
[[self alloc] init];
}
return _sharedDataModel;
}
return _sharedDataModel;
}
//重新allocWithZone方法
+(id) allocWithZone:(struct _NSZone *)zone //第三步:重寫allocWithZone方法
{
@synchronized(self)
{
if (_sharedDataModel
nil)
{
_sharedDataModel=[super allocWithZone:zone];
return _sharedDataModel;
}
}
return nil;
}
//確保copy對象也是唯一的
-(id) copy //第四步
{
return self;
}
//確保計數唯一
-(id) retain
{
return self;
}
-(unsigned) retainCount
{
return UINT_MAX;
}

//oneway以表示該方法是用於異步消息的
-(oneway void) release
{
}

-(id) autorelease
{
return self;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章