iOS中的單例模式
就我本身理解而言,我認為的單例:單例在整個工程中,就相當於一個全局變量,就是不論在哪里需要用到這個類的實例變量,都可以通過單例方法來取得,而且一旦你創建了一個單例類,不論你在多少個界面中初始化調用了這個單例方法取得對象,它們所有的對象都是指向的同一塊內存存儲空間(即單例類保證了該類的實力對象是唯一存在的一個).
“單例模式”是我們在iOS中最常使用的設計模式之一。單例模式不需要傳遞任何參數,就有效地解決了不同代碼間的數據共享問題。單例類是一個非常重要的概念,因為它們表現出了一種十分有用的設計模式。單例類的應用貫穿於整個iOS的SDK中。例如,UIApplication類有一個方法叫sharedApplication,從任何地方調用這個方法,都將返回與當前正在運行的應用程序相關聯的UIApplication實例。除了這個,NSNotificationCenter(消息中心) 、NSFileManager(文件管理) 、 NSUserDefaults(持久化存儲數據) 、NSURLCache(請求緩存)、NSHTTPCookieStorage(應用程序cookies池)都是系統單例;
單例類保證了應用程序的生命周期中有且僅有一個該類的實例對象,而且易於外界訪問。
單例模式的優點:
1.實例控制:Singleton 會阻止其他對象實例化其自己的 Singleton 對象的副本,從而確保所有對象都訪問唯一實例。
2.靈活性:因為類控制了實例化過程,所以類可以更加靈活修改實例化過程。
單例類的實現方法:
(1).通過加線程鎖進行實現:
比如創建了一個DBManager的類
+(DBManager *)sharedManager; (.h文件中)
.m文件中的實現:
+(DBManager *)sharedManager{
Static DBManager *manager = nil;
@synchronized(self){
if(manager == nil){
manager = [[DBManager alloc]init];
}
}
return manager;
}
(2).通過GCD實現單例方法:
+(DBManager *)sharedManager; (.h文件中)
適當實現copyWithZone,release和autorelease。
- (id)init;
{
@synchronized(self) {
if (self = [super init]){
return self;
}
return nil;
}
}
.m文件中的實現:
+(DBManager *)sharedManager{
Static DBManager *manager = nil;
static dispatch_once_t token;
dispatch_once(&token,^{
dispatch_once(&token,^{
if(manager == nil){
manager = [[DBManager alloc]init];
}
} );
return manager;
}
重寫allocWithZone方法,用來保證其他人直接使用alloc和init試圖獲得一個新實力的時候不產生一個新實例,
+(id)allocWithZone:(NSZone *)zone{
@synchronized(self){
if (!manager) {
manager = [super allocWithZone:zone]; //確保使用同一塊內存地址
return manager;
}
return nil;
}
}
+(id)allocWithZone:(NSZone *)zone{
@synchronized(self){
if (!manager) {
manager = [super allocWithZone:zone]; //確保使用同一塊內存地址
return manager;
}
return nil;
}
}
適當實現copyWithZone,release和autorelease。
- (id)init;
{
@synchronized(self) {
if (self = [super init]){
return self;
}
return nil;
}
}