2014-05-02 24 views
0

我正在使用登錄系統連接到我的網絡服務器的移動應用程序。我創建了一個用戶對象,在第一次登錄後,它應該爲下一次應用程序重新啓動保存其令牌。我還需要這個用戶對象是一個單身人士,以便我可以從我的應用程序的任何地方訪問同一個實例。這是我想出了迄今:單身人士在iOS用戶默認

+(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

這裏有一個代碼中斷。可以通過以下方式直接調用init方法。

SECTUser *userInfo = [[SECTUser alloc] init]; 

您不應該允許此方法在類之外運行。爲了實現它,通過下面的方式給init方法賦予適當的屬性。

- (id)init __attribute__((unavailable("init is unavailable"))); 

請參考更多關於here

+0

謝謝。那麼如果我不能初始化它,我該如何從代碼中的任何地方使用該類? – user3060636

+0

您可以通過使用sharedManager方法獲取對象來使用該類。它只是阻止init方法。所以,沒有人在外面創建你的課程的實例。 – Apurv

+0

非常感謝。我知道它超出了範圍,但是,你能提供一個例子嗎?通過以下方式將您的答案標記爲正確:) – user3060636

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

順便說一句你更好的存儲您的令牌鑰匙扣