可退出销毁的单例
2018-07-18 本文已影响125人
每日总结
一般单例的模式
static UserInfo *_user = nil;
//创建,登录时进行初始化
+ (instancetype)shareInstance{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (_user == nil) {
_user = [[UserInfo alloc] init];
}
});
return _user;
}
销毁的处理
//退出时进行赋空
+ (void)destroySelf{
_user = nil;
}
这是我最开始的写法,但是实际运行的时候发现程序每次登录退出之后,再次登录时就会报错
后来发现是再次登录时没有走dispatch_once中的方法。
一番百度后发现,使用dispatch_once是为了多线程下也能保证只创建一个实例,但实际上dispatch_once的作用是保证block中的方法只被执行一次,所以在我将单例销毁之后,他永远都只能是nil了。
要解决这个问题,我们只能换一种方法去保证线程安全。
修改创建方法
使用线程锁
+ (instancetype)shareInstance{
@synchronized(self){
if (_user == nil) {
_user = [[UserInfo alloc] init];
}
}
return _user;
}