單例模式的作用:可以保證在程序運行過程次屠,一個類只有一個實例媒楼,而且該實例易于供外界訪問乐尊,從而方便地控制了實例個數(shù),并節(jié)約系統(tǒng)資源划址。
單例模式的使用場合:在整個應(yīng)用程序中扔嵌,共享一份資源(這份資源只需要創(chuàng)建初始化1次)
ARC中,單例模式的實現(xiàn)
在.m中保留一個全局的static的實例
static id _instance;
重寫allocWithZone:方法夺颤,在這里創(chuàng)建唯一的實例(注意線程安全)
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;}
提供1個類方法讓外界訪問唯一的實例
+ (instancetype)sharedInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[self alloc] init];
});
return _instance;
}
實現(xiàn)copyWithZone:方法
- (id)copyWithZone:(struct _NSZone *)zone
{
return _instance;
}
單例模式通用宏
#define SingleH(name) +(instancetype)share##name;
#if __has_feature(objc_arc)
//條件滿足 ARC
#define SingleM(name) static id _instance;\
+(instancetype)allocWithZone:(struct _NSZone *)zone\
{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [super allocWithZone:zone];\
});\
\
return _instance;\
}\
\
+(instancetype)share##name\
{\
return [[self alloc]init];\
}\
\
-(id)copyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
\
-(id)mutableCopyWithZone:(NSZone *)zone\
{\
return _instance;\
}
#else
//MRC
#define SingleM(name) static id _instance;\
+(instancetype)allocWithZone:(struct _NSZone *)zone\
{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [super allocWithZone:zone];\
});\
\
return _instance;\
}\
\
+(instancetype)share##name\
{\
return [[self alloc]init];\
}\
\
-(id)copyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
\
-(id)mutableCopyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
-(oneway void)release\
{\
}\
\
-(instancetype)retain\
{\
return _instance;\
}\
\
-(NSUInteger)retainCount\
{\
return MAXFLOAT;\
}
#endif