2016-03-16 149 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