一.單列模式簡介
1.什么是單列模式秒际?
a.通過static關鍵詞呕缭,聲明全局變量疗垛。在整個進程運行期間只會被賦值一次
b.單列模式是一種常用的設計模式窜骄,一個類只有一個實例對象剩膘,且該類提供了便宜訪問的接口邦邦,創(chuàng)建的實例可以在程序中全局使用爪飘,用效的節(jié)約系統(tǒng)資源哆档。
2.單例模式的作用
可以保證在程序運行過程贺归,一個類只有一個實例淆两,而且該實例易于供外界訪問
從而方便地控制了實例個數,并節(jié)約系統(tǒng)資源
3.單例模式的使用場合
在整個應用程序中拂酣,共享一份資源(這份資源只需要創(chuàng)建初始化1次)
3.單例模式在ARC\MRC環(huán)境下的寫法有所不同秋冰,需要編寫2套不同的代碼
可以用宏判斷是否為ARC環(huán)境
#if __has_feature(objc_arc)
// ARC
#else
// MRC
#endif
二.單列模式的實現
1.ARC
a.GCD實現
// .h文件
#define TBBSingletonH + (instancetype)sharedInstance;
// .m文件
#define TBBSingletonM\
static id _instace; \
\
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instace = [super allocWithZone:zone]; \
}); \
return _instace; \
} \
\
+ (instancetype)sharedInstance \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instace = [[self alloc] init]; \
}); \
return _instace; \
} \
\
- (id)copyWithZone:(NSZone *)zone \
{ \
return _instace; \
}
使用方法:只有在想設計為單列的類中.ht和.m文件中分別加入TBBSingletonH和TBBSingletonM即可
b.非GCD單列
#import
@interface TBBStu :NSObject
+ (instancetype)sharedInstance;
@end
#import“TBBStu.h"
@interface TBBStu()
@end
@implementation TBBStu
staticid_instance;
+ (instancetype)allocWithZone:(struct_NSZone*)zone
{
@synchronized(self) {
if(_instance==nil) {
_instance= [superallocWithZone:zone];
}
}
return_instance;
}
+ (instancetype)sharedInstance
{
@synchronized(self) {
if(_instance==nil) {
_instance= [[self alloc]init];
}
}
return_instance;
}
- (id)copyWithZone:(NSZone*)zone
{
return_instance;
}
@end
2.非ARC
非ARC中(MRC),單例模式的實現(比ARC多了幾個步驟)
實現內存管理方法
- (id)retain{returnself;}
- (NSUInteger)retainCount{return1; }
- (onewayvoid)release {}
- (id)autorelease{returnself; }
實現代碼:
//.h文件
#import
//單例方法
@interface TBBSingleton : NSObject
+ (instancetype)sharedSingleton;
@end
//.m文件
#import "TBBSingleton.h"
@implementation TBBSingleton
//全局變量
static id _instance = nil;
//單例方法
+(instancetype)sharedSingleton{
//系統(tǒng)的大多數類方法都有做autorelease踱葛,所以我們也需要做一下
return [[[self alloc] init] autorelease];
}
//alloc會調用allocWithZone:
+(instancetype)allocWithZone:(struct _NSZone *)zone{
//只進行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
//初始化方法
-(instancetype)init{
// 只進行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super init];
});
return _instance;
}
- (oneway void)release{
//什么都不做 保證單例對象不被銷毀
}
//返回本身 保證只有一個單例對象
- (instancetype)retain{
return _instance;
}
//計數器為1 保證只有一個單例對象
- (NSUInteger)retainCount{
return 1;
}
//copy在底層 會調用copyWithZone:
+ (id)copyWithZone:(struct _NSZone *)zone{
return? _instance;
}
- (id)copyWithZone:(NSZone *)zone{
return _instance;
}
+ (id)mutableCopyWithZone:(struct _NSZone *)zone{
return _instance;
}
- (id)mutableCopyWithZone:(NSZone *)zone{
return _instance;
}
@end
注意:因為要保證單例對象在程序運行期間一直存在丹莲,所以不需要實現release方法和dealloc方法