缓存来自 NSUserDefaults 的结果?

use*_*965 5 objective-c nsuserdefaults ios

尝试一些 iOS 编程,我使用 NSUserDefaults 来保存我的应用程序需要的几个 NSNumbers。我正在使用典型的代码来获取和设置值,例如

- (NSNumber *)myUserDefaultNumber {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    return [defaults objectForKey:@"XYZ_MyNumber"];
}
Run Code Online (Sandbox Code Playgroud)

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

或者是否有足够的额外成本来激励我进行缓存,例如:

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

我知道我不应该过早优化,但一开始就做明显愚蠢的事情也是错误的。我的第一种方法比简单的记忆差多少?(关于 setter 的同样问题,它可能更贵)。

mat*_*att 3

如果出现问题,您可能是在错误的位置寻找它。objectForKey开销低。如果有的话,高开销肯定​​是高开销standardUserDefaults,因为它在某些时候必须从磁盘加载信息。

但是,您不知道它何时执行此操作或执行此操作的频率,因此您自己缓存任何内容确实没有意义。您只需假设,像往常一样,运行时比您知道更多。请记住,NSUserDefaults 是为了被大量使用而设计的。它不会有任何“陷阱”。

我知道我不应该太早优化,但一开始就做明显愚蠢的事情也是错误的。

确实如此,但这里的危险在于,你所做的愚蠢的事情就是过早优化。如果文档没有提醒您任何可能的问题,通常可以安全地假设不会有任何问题。