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;
}
Run Code Online (Sandbox Code Playgroud)
什么是更好的方法这样做,所以我在进行OCLint分析时没有得到这些警告?
谢谢!
所有实例变量初始化为0; 这意味着BOOLs被初始化为NO.因此效果:
if([[NSUserDefaults standardUserDefaults] objectForKey:kTermsAccepted] != nil){
_termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted];
}
Run Code Online (Sandbox Code Playgroud)
...是:如果存储了值,则设置_termsAccepted为它.否则_termsAccepted就会NO.
boolForKey: 记录的返回值为:
如果布尔值与用户默认值中的defaultName相关联,则返回该值.否则,
NO返回.
所以比较和对比只是:
_termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted];
Run Code Online (Sandbox Code Playgroud)
...在这种情况下,最终结果将是:如果存储了值,则设置_termsAccepted为它.否则_termsAccepted就会NO.
因此,为了减少圈复杂度,请删除if语句.他们什么都没有.
编辑:正确地指出,我错过了BOOLs并非专门使用的事实.
使用-[NSUserDefaults registerDefaults:]建立您的备用值.这些一旦保存就会保存在内存中,但不会写入商店.然后,用户默认自己将处理所有类型的对象的"如果没有存储值,则使用此值"的情况.
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |