可退出销毁的单例

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;
}
上一篇 下一篇

猜你喜欢

热点阅读