【问题标题】:NSUserDefaults always returns 1 instead of correct integerNSUserDefaults 总是返回 1 而不是正确的整数
【发布时间】:2012-09-26 04:11:01
【问题描述】:

我正在尝试将我的游戏的当前级别存储在 NSUserDefaults 中,但是当我尝试将其转换为 int 时它总是返回 1。这是测试代码:

    [[NSUserDefaults standardUserDefaults] setInteger:34 forKey:@"Current Level"];
    NSLog(@"default level raw: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"Current Level"]);
    self.levelNum = [[[NSUserDefaults standardUserDefaults] objectForKey:@"Current Level"] intValue];
    NSLog(@"default level num: %i", self.levelNum);

还有输出:

default level raw: 34
default level num: 1

【问题讨论】:

  • levelNum”声明为什么?
  • levelNum 被声明为 int。

标签: objective-c ios xcode nsuserdefaults


【解决方案1】:

只要确保在 NSUSerDefaults 上调用同步:

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];

[defaults setInteger:34 forKey:@"Current Level"];
NSLog(@"default level raw: %@", [defaults objectForKey:@"Current Level"]);

[defaults synchronize]; // Call synchronize after set

self.levelNum = [defaults integerForKey:@"Current Level"];
NSLog(@"default level num: %i", self.levelNum);

【讨论】:

  • 最好使用 [defaults integerForKey:@"Current Level"]);
  • 很棒的提示,谢谢!我逐字粘贴了您的代码,它仍然给我 34 的原始值和 1 的整数值。还有其他想法吗?
  • 嗯.. 我尝试了代码,当然我无法复制您所说的内容......还有其他可能运行 setInteger:1 的(另一个线程)吗?
  • @JamesMorrison,真的吗?我逐字粘贴了 abellina 的代码,两者都得到了 34。您是如何在 .h 文件中定义 levelNum 的?
  • 不这么认为。在添加 levelnumber 之前,我使用 options.plist 中的一组选项填充默认值。不知道这会如何影响它。转储默认值显示当前级别为 34。似乎是转换为整数导致它变为 1?
【解决方案2】:

关于您的代码的一件事是您正在使用“setInteger”(这是一个 NSInteger)

[defaults setInteger:34 forKey:@"Current Level"];

self.levelNum = [[[NSUserDefaults standardUserDefaults] objectForKey:@"Current Level"] intValue]

假设您正在返回一个 NSNumber 对象,您正在从中读取“int”(不一定与“NSInteger”相同)。

代替第二次调用,使用:

self.levelNum = [[NSUserDefaults standardUserDefaults ] integerForKey: @"Current Level"];

"integerForKey:" 是使用“setInteger:forKey:”时使用的正确方法。

【讨论】:

  • 啊,没错。好吧,这是一个问题,尽管问题仍然存在。
  • 将您的“levelNum”声明从“int”更改为“NSInteger”,然后让我知道这是否对您来说更好一点。
  • NSInteger 是相当于 int 或 long 的 typedef:stackoverflow.com/a/1753275/1344738
  • 更改为 NSInteger。还是说1。太奇怪了。
【解决方案3】:

哦。我的。上帝。我是个白痴。我忘记了我定义了一个自定义 setLevelNum 方法来防止将级别设置在现有级别的范围之外。由于上面的代码发生在我定义级别集之前,它会自动将其设置为最低级别,即 1。删除了它,现在它可以工作了。谢谢大家的帮助。至少我学到了很多关于 Objective-C 数据类型的知识:-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2017-09-17
    • 1970-01-01
    相关资源
    最近更新 更多