一、單例模式:
單例模式不需要傳遞任何參數(shù),就有效地解決了不同代碼間的數(shù)據(jù)共享問題。單例類是一個非常重要的概念,因為它們表現(xiàn)出了一種十分有用的設(shè)計模式。單例類的應(yīng)用貫穿于整個iOS的SDK中。例如,UIApplication類有一個方法叫sharedApplication,從任何地方調(diào)用這個方法,都將返回與當前正在運行的應(yīng)用程序相關(guān)聯(lián)的UIApplication實例。除了這個,NSNotificationCenter(消息中心) 、NSFileManager(文件管理) 、 NSUserDefaults(應(yīng)用程序設(shè)置) 、NSURLCache(請求緩存)、NSHTTPCookieStorage(應(yīng)用程序cookies池)都是系統(tǒng)單例;單例類保證了應(yīng)用程序的生命周期中有且僅有一個該類的實例對象,而且易于外界訪問。
二、單例模式的要點:
1、某個類只能有一個實例。
2、它必須自行創(chuàng)建這個實例。
3、它必須自行向整個系統(tǒng)提供這個實例。
三、單例模式的優(yōu)點:
1、實例控制:Singleton 會阻止其他對象實例化其自己的 Singleton 對象的副本,從而確保所有對象都訪問唯一實例?!?br> 2、靈活性:因為類控制了實例化過程,所以類可以更加靈活修改實例化過程IOS中的單例模式。
四、創(chuàng)建一個單例至少需要四個步驟:
1、為單例對象實現(xiàn)一個靜態(tài)實例,并初始化,然后設(shè)置成nil。
2、實現(xiàn)一個實例構(gòu)造方法檢查上面聲明的靜態(tài)實例是否為nil,如果是則新建并返回一個本類的實例。
3、重寫allocWithZone方法,用來保證其他人直接使用alloc和init試圖獲得一個新實例的時候不產(chǎn)生一個新實例。
4、適當實現(xiàn)copyWithZone。
Demo:創(chuàng)建一個單例類SingletonClass,定義它的屬性和方法。
.h
#import <Foundation/Foundation.h>
@interface SingletonClass : NSObject
@property (assign, nonatomic)int age;//定義一個屬性
//單例方法
+(SingletonClass *)sharedInstance;
@end
.m
#import "SingletonClass.h"
@implementation SingletonClass
//1、為單例對象實現(xiàn)一個靜態(tài)實例,并初始化,然后設(shè)置成nil,
static SingletonClass *manager = nil;
//2、實現(xiàn)一個實例構(gòu)造方法檢查上面聲明的靜態(tài)實例是否為nil,如果是則新建并返回一個本類的實例,
+(SingletonClass *)sharedInstance{
@synchronized(self) {
if(manager == nil) {
manager = [[SingletonClass alloc] init];
}
}
return manager;
}
//3、重寫allocWithZone方法,用來保證其他人直接使用alloc和init試圖獲得一個新實例的時候不產(chǎn)生一個新實例,
+(id)allocWithZone:(NSZone *)zone{
@synchronized(self){
if (!manager) {
manager = [super allocWithZone:zone]; //確保使用同一塊內(nèi)存地址
return manager;
}
return nil;
}
}
//4、適當實現(xiàn)copyWithZone,確保copy對象也是唯一
- (id)copyWithZone:(NSZone *)zone{
return self;
}
//初始化方法,初始化自己的屬性
- (id)init{
@synchronized(self) {
if (self = [super init]){
self.age = 10;
return self;
}
return nil;
}
}
@end
使用:#import "SingletonClass.h"
SingletonClass *singleton = [SingletonClass sharedInstance];
singleton.age = 15;