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