objective-c - 如何在从 NSUserDefaults 初始化时降低高圈复杂度

标签 objective-c optimization static-analysis lint 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;这意味着 BOOL 被初始化为 NO。因此效果:

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

... 是:如果有存储值,则将 _termsAccepted 设置为它。否则 _termsAccepted 将为 NO

boolForKey: 有记录的返回值:

If a boolean value is associated with defaultName in the user defaults, that value is returned. Otherwise, NO is returned.

所以比较和对比:

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

... 在这种情况下,最终结果将是:如果存在存储值,则将 _termsAccepted 设置为它。否则 _termsAccepted 将为 NO

因此,为了降低圈复杂度,请删除 if 语句。他们什么都不加。

编辑:有人正确地指出,我错过了 BOOL 并非专门使用的事实。

使用 -[NSUserDefaults registerDefaults:] 来建立你的后备值。这些一旦设置就保存在内存中,但不会写入商店。然后用户默认自己将为所有类型的对象处理“如果没有存储值,则使用此值”的情况。

关于objective-c - 如何在从 NSUserDefaults 初始化时降低高圈复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36043436/

相关文章:

ios - 绘图区域填充以防止符号被截断。 (核心剧情)

ios - 将单元格添加到 UITableView,但它们不会在视觉上显示,但我可以单击并且它们可以工作

c++ - 函数调用的成本是多少?

python - 如何在Python中加快像函数一样的卷积?

Java静态分析: Getting started

java - 如何检测 Java 中的方法调用?

objective-c - project.xcworkspace 文件重要吗?

objective-c - 使用自定义类属性使两个 NSMutableSet 相等

java - 关于空间/时间的 Groovy 集合性能注意事项

bash - 使用适当的引用自动重写 bash 脚本的工具?