2016-03-16 150 views
3
NSUserDefaults的初始化

我有這個初始化的對象:如何降低高圈複雜度,同時從

-(id)init 
{ 
    self = [super init]; 
    if (self) { 
     if([[NSUserDefaults standardUserDefaults] objectForKey:kTermsAccepted] != nil){ 
      _termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted]; 
     } 
     if([[NSUserDefaults standardUserDefaults] objectForKey:kInitialSetupCompleted] != nil){ 
      _initialSetupCompleted = [[NSUserDefaults standardUserDefaults] boolForKey:kInitialSetupCompleted]; 
     } 
     if([[NSUserDefaults standardUserDefaults] objectForKey:kDashboardMessage] != nil){ 
      _dashboardMessage = [[NSUserDefaults standardUserDefaults] objectForKey:kDashboardMessage]; 
     } else{ 
      _dashboardMessage = [[NSBundle mainBundle] localizedStringForKey:kDMDefaultDashboardMessage value:kDMDefaultDashboardMessage table:nil]; 
     } 
     //50 other if statements 
    } 
    return self; 
} 

這將是一個更好的方式來做到這一點,所以我沒有得到這些警告,而這樣做的OCLint分析?

謝謝!

回答

5

所有實例變量初始化爲0;這意味着BOOL s被初始化爲NO。因此效果:

if([[NSUserDefaults standardUserDefaults] objectForKey:kTermsAccepted] != nil){ 
    _termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted]; 
} 

...是:如果有一個存儲的值然後設置_termsAccepted它。否則_termsAccepted將是NO

boolForKey:具有一個記錄返回值:

如果一個布爾值在用戶 默認與defaultName中相關聯,則返回該值。否則,返回NO

所以比較和對比只:

_termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted]; 

...在這種情況下,最終的結果將是:如果有一個存儲的值然後設置_termsAccepted它。否則_termsAccepted將是NO

因此爲了減少圈複雜度,請刪除if語句。他們什麼也沒加。

編輯:它已被正確指出,我已經錯過了BOOL s不是專門使用的事實。

使用-[NSUserDefaults registerDefaults:]建立您的回退值。那些記憶一旦被設定但不寫入商店。然後,用戶默認自己將處理所有類型對象的「如果沒有存儲值,則使用此值」情況。

+0

好的,也許我的問題並不清楚。或者,也許是。但是,如果「/ 50其他if語句」中還有其他類型的變量,則不僅是BOOL。我有NSStrings,NSMutableArrays,NSDate等。直接任務是否可以與任何類型的工作? – Jan

+0

我實際上添加了一個我的情況,我想用默認值初始化,以防NSUserDefaults不在那裏... – Jan

+2

我可能沒有讀到這個問題。我的錯。在編輯過程中,嘗試使用' - [NSUserDefaults registerDefaults:]'來設置NSUserDefaults在找不到值時應該返回的值。他們從不覆蓋實際存儲的信息,並且自己從不寫入商店。這僅僅是內存回退。 – Tommy