在開發(fā)中經(jīng)常會用到單例設(shè)計模式首懈,目的就是為了在程序的整個生命周期內(nèi),只會創(chuàng)建一個類的實例對象谨敛,而且只要程序不被殺死究履,該實例對象就不會被釋放。常用的2中創(chuàng)建單例的方法:利用GCD方式脸狸;互斥鎖方式創(chuàng)建最仑。
1.利用GCD方式創(chuàng)建單例
#import "ClassA.h"
@implementation ClassA
static ClassA *classA = nil;//靜態(tài)的該類的實例
+ (instancetype)sharedClassA
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
classA = [[self alloc] init];
});
return classA;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
classA = [super allocWithZone:zone];
});
return classA;
}
- (id)copyWithZone:(NSZone *)zone
{
return classA;
}
- (id)mutableCopyWithZone:(NSZone *)zone {
return classA;
}
@end
2.互斥鎖方式
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
@synchronized(self) {
if (classA == nil) {
classA = [super allocWithZone:zone];
}
}
return classA;
}
+ (instancetype)sharedInstance
{
@synchronized(self) {
if (classA == nil) {
classA = [[self alloc] init];
}
}
return classA;
}
- (id)copyWithZone:(NSZone *)zone
{
return classA;
}
***還有就是當一個項目工程中需要用到多個單例時,可以利用宏來把單例提出來炊甲,可以節(jié)省類的創(chuàng)建:
在Singleton.h文件中:
#define SingletonH(name) + (instancetype)shared##name;
#define SingletonM(name) \
static id _instance; \
\
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [super allocWithZone:zone]; \
}); \
return _instance; \
} \
\
+ (instancetype)shared##name \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [[self alloc] init]; \
}); \
return _instance; \
} \
\
- (id)copyWithZone:(NSZone *)zone \
{ \
return _instance; \
}\
\
- (id)mutableCopyWithZone:(NSZone *)zone { \
return _instance; \
}