ios中的单例,具有用户默认值

时间:2014-05-02 08:35:38

标签: ios objective-c singleton

我正在开发一个移动应用程序,通过登录系统连接到我的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应该只在第一次实例化时加载值第一次

这是实现通缉行为的正确方法吗?有什么方法可以检查这是否正常工作?

提前致谢。

2 个答案:

答案 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;
}

顺便说一句,你最好将你的代币存放在钥匙串中