Jan*_*Jan 3 optimization static-analysis lint objective-c oclint
我有一个对象的初始化器:
-(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分析时没有得到这些警告?
谢谢!
所有实例变量初始化为0; 这意味着BOOLs被初始化为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语句.他们什么都没有.
编辑:正确地指出,我错过了BOOLs并非专门使用的事实.
使用-[NSUserDefaults registerDefaults:]建立您的备用值.这些一旦保存就会保存在内存中,但不会写入商店.然后,用户默认自己将处理所有类型的对象的"如果没有存储值,则使用此值"的情况.