从 NSUserDefaults 缓存结果?

Cache results from NSUserDefaults?

尝试一些 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 的相同问题,它可能更贵)。

如果有问题,您可能找错地方了。 objectForKey 开销很低。高开销(如果有的话)肯定是 standardUserDefaults,因为它在某些时候必须从磁盘加载信息。

但是,您不知道它什么时候这样做或者多久这样做,所以缓存任何东西真的没有意义你自己。您只需要像往常一样假设运行时比您知道的更多。请记住,NSUserDefaults 是用来使用的——很多。它不会有任何 "gotchas".

I know that I shouldn't optimize too early, but its also wrong to do obviously dumb things to begin with.

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