單例
單例模式的意圖就是使得類中的一個(gè)對(duì)象成為系統(tǒng)中的唯一實(shí)例董栽。它提供了對(duì)類的對(duì)象所提供的資源的全局訪問點(diǎn)够吩。因此需要用一種只允許生成對(duì)象類的唯一實(shí)例的機(jī)制。下面讓我們來看下單例的作用:
可以保證的程序運(yùn)行過程剩檀,一個(gè)類只有一個(gè)示例澄干,而且該實(shí)例易于供外界訪問,從而方便地控制了實(shí)例個(gè)數(shù)跷跪,并節(jié)約系統(tǒng)資源馋嗜。
- 單例模式的使用場合
類只能有一個(gè)實(shí)例,并且必須從一個(gè)為人數(shù)值的訪問點(diǎn)對(duì)其訪問域庇。
這個(gè)唯一的實(shí)例只能通過子類化進(jìn)行拓展嵌戈,并且拓展的對(duì)象不會(huì)破壞客戶端代碼。
單例的實(shí)現(xiàn)
SingleTonTest.h中
#import <Foundation/Foundation.h>
@interface SingleTonTest : NSObject
//單例中的屬性
@property(nonatomic,copy)NSString *sendStr;
@property (strong, nonatomic) NSMutableArray *arrayM;
+(SingleTonTest *)sharedSingleTon;
@end
SingleTonTest.m中
#import "SingleTonTest.h"
static SingleTonTest *singleTon = nil;
@implementation SingleTonTest
//經(jīng)典方式
//+(SingleTonTest *)currentUser
//{
// if(singleTon == nil){
//
// singleTon = [[self.class alloc]init];
//
// }
// return singleTon;
//}
//GCD方式(建議使用)
+(SingleTonTest *)sharedSingleTon{
static dispatch_once_t onceTocken;
dispatch_once(&onceTocken,^{
if (!singleTon) {
singleTon = [[SingleTonTest alloc]init];
}
});
return singleTon;
}
//重寫allocWithZone方法听皿,用來保證其他人直接使用alloc和init試圖獲得一個(gè)新實(shí)例的時(shí)候不產(chǎn)生一個(gè)新實(shí)例熟呛,
+(id)allocWithZone:(NSZone *)zone{
@synchronized(self){
if (!singleTon) {
singleTon = [super allocWithZone:zone]; //確保使用同一塊內(nèi)存地址
return singleTon;
}
return nil;
}
}
//自定義初始化方法
- (instancetype)init
{
self = [super init];
if(self){
self.sendStr = @"Singleton";
self.arrayM = [[NSMutableArray alloc] init];
}
return self;
}
//重寫該方法主要確保當(dāng)用戶通過copy方法產(chǎn)生對(duì)象時(shí)對(duì)象的唯一性
- (id)copy
{
return self;
}
//重寫該方法主要確保當(dāng)用戶通過mutableCopy方法產(chǎn)生對(duì)象時(shí)對(duì)象的唯一性
- (id)mutableCopy
{
return self;
}
@end