2

我正在看斯坦福 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 没有意义。

你能帮我吗?

4

3 回答 3

2

你可以把它想象成一个NSDictionary,你提供的key仅供你自己参考。供您稍后取回该值。您可以将其称为 @"CalculatorGraphViewController.Favorites" 之类的字符串或您喜欢的任何其他字符串。他们这样命名只是为了确定这是记录在 CalculatorGraphViewController 中的收藏夹选项的值,我相信。

于 2012-10-14T14:31:27.563 回答
1

正如其他人所指出的,密钥是任意字符串。问题是您的应用程序的许多部分可能会写入默认值。如果你选择了一些非常简单的东西作为键,比如“收藏夹”,那么很可能你的应用程序的两个部分都会尝试使用相同的键来做不同的事情。(比如说,对于最喜欢的艺术家和最喜欢的歌曲。)

这是编程中的一个常见问题,通常通过引入命名空间或某种前缀来解决,以降低冲突的可能性。您经常可以在 Java 类中看到命名空间,例如com.someguy.AppName.SomeClassName. 甚至在域名中——比如developer.facebook.comdeveloper.apple.com. 两者都使用术语“开发者”,但都在命名空间(com.facebookvs com.apple)上有所不同。

您可以在用例中使用相同的解决方案,并将命名空间引入默认键。命名空间的逻辑选择是类名,因为您不太可能有两个具有相同名称的类。这样你就得到了CalculatorGraphViewController前缀。点只是在命名空间中分隔组件的一种习惯方式。

于 2012-10-14T14:43:48.777 回答
0

它只是键,可以是任何字符串或对象,但不能是 nil

于 2012-10-14T14:32:43.413 回答