我正在观看斯坦福CS193P的教训,特别是7号讲座。我对NSUserDefaults
有些怀疑。这是代码的一部分:
#define FAVORITES_KEY @"CalculatorGraphViewController.Favorites"
- (IBAction)addToFavorites:(id)sender
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *favorites = [[defaults objectForKey:FAVORITES_KEY] mutableCopy];
if (!favorites) favorites = [NSMutableArray array];
[favorites addObject:self.calculatorProgram];
[defaults setObject:favorites forKey:FAVORITES_KEY];
[defaults synchronize];
}
我阅读了有关NSUserDefaults
的文档,但我不明白这段代码[[defaults objectForKey:FAVORITES_KEY] mutableCopy]
。 FAVORITES_KEY
是@"CalculatorGraphViewController.Favorites"
。
我的问题是为什么我应该使用CalculatorGraphViewController.Favorites
?我不懂点!在我看来,getter或setter的结构,但收藏夹有一个大写字母,然后CalculatorGraphViewController.Favorites没有意义。
你可以帮我吗?
答案 0 :(得分:2)
您可以将其视为NSDictionary,而您提供的密钥仅供您自己参考。您可以稍后检索该值。您可以将其称为@“CalculatorGraphViewController.Favorites”或任何其他您喜欢的字符串。他们这样命名只是为了确定这是在CalculatorGraphViewController中记录的收藏夹选项的值,我相信。
答案 1 :(得分:1)
正如其他人所说,关键是任意字符串。问题在于,应用程序的许多部分都可以写入默认值。如果你选择一些非常简单的东西作为关键词,比如说“收藏夹”,很可能会发生你的应用程序的两个部分都试图使用相同的键来表示不同的东西。 (说,对于最喜欢的艺术家和喜欢的歌曲。)
这是编程中的常见问题,通常通过引入命名空间或某种使冲突不太可能的前缀来解决。您经常可以在Java类中看到名称空间,例如com.someguy.AppName.SomeClassName
。甚至在域名中 - 例如developer.facebook.com
和developer.apple.com
。两者都使用术语“开发人员”,但两者在命名空间方面都有所不同(com.facebook
与com.apple
)。
您可以在用例中使用相同的解决方案,并在默认密钥中引入命名空间。命名空间的逻辑选择是类名,因为您不太可能有两个具有相同名称的类。因此,您到达CalculatorGraphViewController
前缀。点只是分隔命名空间中组件的一种常用方法。
答案 2 :(得分:0)
它只是关键,它可以是任何字符串或对象,但不是nil