我正在开发一个移动应用程序,通过登录系统连接到我的Web服务器。我创建了一个用户对象,在第一次登录后,应保存其令牌以便下次重启应用程序。我还需要这个用户对象是一个单例,以便我可以从我的应用程序中的任何位置访问同一个实例。这是我到目前为止所提出的:
+(id)sharedManager {
static SECTUser *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
-(id)init{
if (self = [super init]) {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *savedToken = [ defaults objectForKey: @"token" ];
NSString *savedName = [ defaults objectForKey: @"name" ];
if(savedToken && savedName){
_token = savedToken;
_name = savedName;
}
}
return self;
}
sharedManager用于创建单例,init应该只在第一次实例化时加载值第一次和。
这是实现通缉行为的正确方法吗?有什么方法可以检查这是否正常工作?
提前致谢。
答案 0 :(得分:0)
这里的代码有一个中断。可以通过以下方式直接调用init方法。
SECTUser *userInfo = [[SECTUser alloc] init];
您不应该允许此方法在类外部运行。要实现它,请通过以下方式为init方法提供适当的属性。
- (id)init __attribute__((unavailable("init is unavailable")));
请参阅here以上的更多信息。
答案 1 :(得分:0)
+(id)sharedManager {
static SECTUser *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
sharedMyManager.savedToken = [ defaults objectForKey: @"token" ];
sharedMyManager.savedName = [ defaults objectForKey: @"name" ];
});
return sharedMyManager;
}
顺便说一句,你最好将你的代币存放在钥匙串中