从NSUserDefaults中缓存结果?

5
尝试进行iOS编程,我正在使用NSUserDefaults保存我的应用程序需要的一些NSNumbers。我正在使用典型的代码来获取和设置值,例如:
- (NSNumber *)myUserDefaultNumber {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    return [defaults objectForKey:@"XYZ_MyNumber"];
}

但我不知道的是运行时成本。我可以像使用常规getter一样调用它,每当我需要值时调用[self myUserDefaultNumber];,可能会经常调用吗?

还是说涉及足够多的额外成本,这会促使我进行缓存,比如:

// setup a property called myUserDefaultNumber, and
- (NSNumber *)myUserDefaultNumber {
    if (!_myUserDefaultNumber) {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        _myUserDefaultNumber = [defaults objectForKey:@"XYZ_MyNumber"];
    }
    return _myUserDefaultNumber;
}

我知道不应该过早优化,但一开始做显然愚蠢的事情也是错误的。相比于简单的内存获取,我的第一种方法有多糟糕?(同样的问题也适用于setter,可能会更加昂贵)。


2
假设 NSUserDefaults 足够聪明,可以为您进行缓存。除非您确实存在或怀疑实际的性能问题,否则不必担心它。 - rmaddy
这是一个非常奇怪的问题...... NSNumber 在哪里和什么时候被使用?它需要频繁访问吗?您是否测试并验证了性能影响?如果是这样,那么最好只是使用其他东西而不是 NSUserDefault。如果没有,那就没问题 :) - Vinzzz
1个回答

3
如果出现问题,你可能正在错误的地方查找。objectForKey的开销很低。如果有高开销,那肯定是standardUserDefaults,因为它在某个时候必须从磁盘加载信息。
然而,你不知道它何时如何频繁地执行这项工作,所以没有必要自己缓存任何东西。你只能假设通常情况下运行时比你更懂得多。请记住,NSUserDefaults被设计为经常使用。它不会有任何“陷阱”。
引用:
我知道我不应该过早优化,但做明显愚蠢的事情也是不对的。
没错,但危险在于你正在做的愚蠢之举就是太早进行优化。如果文档没有提示可能存在任何问题,那么通常可以安全地假设不会有任何问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接