單例模式介紹:##
單例模式算是設(shè)計(jì)模式中比較簡(jiǎn)單的形式,其意圖是使得類的一個(gè)對(duì)象成為系統(tǒng)中的唯一實(shí)例。準(zhǔn)確定義為:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。-《設(shè)計(jì)模式》
單例模式優(yōu)點(diǎn):##
實(shí)例控制:Singleton 會(huì)阻止其他對(duì)象實(shí)例化其自己的 Singleton 對(duì)象的副本,從而確保所有對(duì)象都訪問(wèn)唯一實(shí)例。
靈活性:因?yàn)轭惪刂屏藢?shí)例化過(guò)程,所以類可以更加靈活修改實(shí)例化過(guò)程。
單例模式實(shí)現(xiàn):##
先在Singleton.h中聲明Singleton類:
@interface Singleton : NSObject
{
}
+ (Singleton *) sharedInstance;
@end
聲明完了接下來(lái)應(yīng)該去實(shí)現(xiàn),如果了解C++或者看過(guò)C++中單例的實(shí)現(xiàn),會(huì)發(fā)現(xiàn)比較簡(jiǎn)單,這是因?yàn)榭梢詫㈩惖臉?gòu)造函數(shù)聲稱為private(私有)。但在Objective-C中,每個(gè)方法都是公有的,所以需要重載一些基本的對(duì)象分配方法,具體實(shí)現(xiàn)如下:
#import "Singleton.h"
@implementation Singleton
static Singleton *sharedSingleton_ = nil;
+ (Singleton *) sharedInstance
{
if (sharedSingleton_ == nil)
{
sharedSingleton_ = [[super allocWithZone:NULL] init];
}
return sharedSingleton_;
}
這里需要說(shuō)明下,為什么用super而不用self?因?yàn)樵趕elf中重載了基本的對(duì)象分配方法,所以需要借助父類(NSObject)的功能,來(lái)處理底層內(nèi)存分配任務(wù)。
+ (id) allocWithZone:(NSZone *)zone
{
return [[self sharedInstance]];
}
//重載copyWithZone:(NSZone *)zone,保證不會(huì)返回實(shí)例的副本
- (id) copyWithZone:(NSZone *)zone
{
return self;
}
- (id) retain
{
return self;
}
- (NSUInteger) retainCount
{
return NSUInterMax;
}
- (void) release
{
}
- (id) autorelease
{
return self;
}
@end
以上是retain、 release和autorelease被重載,確保他們(在ARC模式下)什么都不做,只是返回self。
總結(jié):##
單例模式其實(shí)在Cocoa Touch框架中很常見,比如UIApplication類,在Objective-C中要實(shí)現(xiàn)一個(gè)單例類,大體需要做以下四個(gè)步驟:
1、為單例對(duì)象實(shí)現(xiàn)一個(gè)靜態(tài)實(shí)例,并初始化,然后設(shè)置成nil。
2、實(shí)現(xiàn)一個(gè)實(shí)例構(gòu)造方法檢查上面聲明的靜態(tài)實(shí)例是否為nil,如果是則新建并返回一個(gè)本類的實(shí)例。
3、重寫allocWithZone、copyWithZone方法,用來(lái)保證其他人直接使用alloc和init試圖獲得一個(gè)新實(shí)例的時(shí)候不產(chǎn)生新的。
4、重寫retain、retainCount、release等方法,確保在ARC模式下什么都不做。
PS:筆試中經(jīng)常會(huì)遇到“怎樣實(shí)現(xiàn)一個(gè)單例”這種問(wèn)題。