什么是单例模式
>它可以保证某个类创建出来的对象永远只有1个,
作用
1>节省内存开销
2>如果有一些数据,整个程序中都用得上,只需要使用同一份资源,分配一块内存即可,(可以保证大家访问的数据是相同的)。如果不用单例模式,访问的数据就是不同的
3>一般来说,工具类设计为单例模式;
实现
MRC环境
创建单例设计模式的基本步骤 ·
1.>声明一个单件对象的静态实例,并初始化为nil。
2.>创建一个类的类工厂方法,当且仅当这个类的实例为nil时生成一个该类的实例
3.>使用allocWithZone代理alloc方法(alloc 方法内部会调用allocWithZone:),确保用户在直接分配和初始化对象时,不会产 生另一个对象。
4.>在多线程的环境中,注意使用@synchronized关键字或GCD一次性执行方法(static dispatch_once_t oncetoken dispatch_once(&onceToken,^{})),确保线程安全
5.>覆盖release、autorelease、retain、retainCount方法, 以此确保单例的状态。
6.>实现NScopying协议, 重写copyWithZone:方法和mutablecopyWithZone,确保用户在直接使用copy方法时,不会产 生另一个对象。
.h
#import
@interface MitchellTool : NSObject
+ (instancetype)shareTools;
@end
.m
#pragma mark ------------------ MRC&&ARC ------------------
+ (instancetype)shareTools{
return [[self alloc] init];
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
// NSLog(@"%s",__func__);
// return [super allocWithZone:zone];
static id instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [super allocWithZone:zone];
});
return instance;
}
/* 单例无论调用什么方法都返回自己 */
-(id)copyWithZone:(NSZone *)zone{
return self;
}
-(id)mutableCopyWithZone:(NSZone *)zone{
return self;
}
#pragma mark ------------------ MRC ------------------
/* 返回一个特殊数告诉别人这是一个单例 */
-(NSUInteger)retainCount{
return -1;
}
/* 重写retain之后,重写retain返回自己 */
-(instancetype)retain{
return self;
}
-(oneway void)release{
}
二、单例抽取与快速创建
Demo地址
//##name将name拼接到前面的字符串
#define SingleInterface(name) +(instancetype)share##name
#if __has_feature(objc_arc)
// ARC
#define SingleImplementation(name) + (instancetype)share##name\
{\
return [[self alloc] init];\
}\
+ (instancetype)allocWithZone:(struct _NSZone *)zone\
{\
static id instance;\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
instance = [super allocWithZone:zone];\
});\
return instance;\
}\
-(id)copyWithZone:(NSZone *)zone{\
return self;\
}\
-(id)mutableCopyWithZone:(NSZone *)zone{\
return self;\
}
#else
//MRC
#define SingleImplementation(name) + (instancetype)share##name\
{\
return [[self alloc] init];\
}\
+ (instancetype)allocWithZone:(struct _NSZone *)zone\
{\
static id instance;\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
instance = [super allocWithZone:zone];\
});\
return instance;\
}\
-(id)copyWithZone:(NSZone *)zone{\
return self;\
}\
-(id)mutableCopyWithZone:(NSZone *)zone{\
return self;\
}\
-(NSUInteger)retainCount{\
return -1;\
}\
-(instancetype)retain{\
return self;\
}\
-(oneway void)release{\
}
#endif