单例模式的精髓就是不论怎么调alloc,share,copy都只会创建一个对象。
单例模式不能用继承去实现,因为用继承,整个程序只有一个_instance变量,所以两个类继承同一个单例类
就会造成,无论哪个类创建出来的对象都是一样的。
单例模式的使用方法1:GCD方法实现单例模式
在.h文件中声明一个share方法
<span style="font-family:Microsoft YaHei;font-size:14px;">+ (instancetype)shareInstace;</span>
直接写这一部分公共代码就行
1、allocWithZone的重写,用gcd的一次性方法,创建一个_instance对象,之后返回。
static id _instance;
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t once_Token;
dispatch_once(&once_Token, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
2、写share方法,也用gcd的一次性代码方法,创建一个,返回
+(instancetype)shareInstance
{
static dispatch_once_t once_Token;
dispatch_once(&once_Token, ^{
_instance = [[self alloc]init];
});
return _instance;
}
3、从写copy方法,直接返回
- (id)copyWithZone:(NSZone *)zone
{
return _instance;
}
可以直接放到单例头文件中,用宏去调用
.h文件中声明
.m文件中实现
单例模式使用方法2:非GCD模式实现单例模式
用 @synchronized(self)同步锁的方法实现一次性创建对象。
.m里的写法
.h里的写法