singleton是否可以这样写

1
2
3
4
5
6
7
8
9
10
11
+ (instancetype)shareUser {
static JSBUserModel *_user;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_user = [NSKeyedUnarchiver unarchiveObjectWithFile:SavePath];
if (_user == nil) {
_user = [JSBUserModel new];
}
});
return _user;
}

在修改老项目的旧代码时,我和同事发现了这行几行代码!这是一个用户数据模型(userModel),用于存储用户的信息。

登录获取用户数据后,转换成模型,并归档到本地。当使用的时候到本地解档!解档!单例方法中解档?WHAT ?什么鬼?

疑惑:单例方法shareUser中的dispatch_once(&onceToken, ^{ xxxxxx}只执行一次,如何在使用的时候本地解档呢?我们对着代码改了又改,看了又看!

一个上午,当我们多次command + R重新运行项目都需要重新输入帐号密码的时候,顿时疑惑被解开:

单例指的是在程序运行期间存在与内存中的唯一的示例对象,当程序死掉或者被杀掉的时候,应用占用的内存会被销毁,内存中的单例自然也会被销毁掉!!
当再次启用应用的时候,会创建新的内存—新的单例实例!自然会走单例方法中`dispatch_once(&onceToken, ^{ xxxxxx}中的代码