【问题标题】:integerForKey: always returns zerointegerForKey:总是返回零
【发布时间】:2010-06-22 09:38:13
【问题描述】:

我正在尝试从我的首选项文件中检索一个整数值。有趣的是它总是返回零,尽管它确实存在并且integerForKey: 和setIntegerForKey: 的名称相同。

这是我检索值的方法:[defaults integerForKey:@"BackUpSize"];

我在这里设置它:[defaults setInteger:[sizeSlider doubleValue]*8589934592 forKey:@"BackUpSize"];

我惊呆了。它应该可以工作......还是我在这里遗漏了什么?

谢谢

编辑:默认创建如下:NSUserDefaults*defaults = [NSUserDefaults standardUserDefaults];

编辑:我已经尝试为这个问题创建自己的 NSUserDefaults 方法,但它仍然返回零。

-(void)setDouble:(double)dou forKey:(id)key
{
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithDouble:dou] forKey:key];
}
-(double)doubleForKey:(id)key
{
    return [[[NSUserDefaults standardUserDefaults] objectForKey:key] doubleValue];
}

【问题讨论】:

  • 您确认defaults 不是nil? nil 上的方法调用返回...0。
  • 默认值只是 [NSUserDefaults standardUserDefaults]...
  • 刚刚验证它不是零。
  • 两个语句是否属于同一类?您是发送setInteger:forKey: 之前 integerForKey:,还是之后?您是正常退出应用程序,还是从 Xcode 中终止它?
  • setInteger:forKey: 在被读取之前发生。我确实正常退出了应用程序,因为当通过 xcode 完成时,没有保存任何首选项。

标签: cocoa macos integer nsuserdefaults


【解决方案1】:

8589934592 是硬编码文字? 真的吗? 你至少应该输入1 << 33 之类的内容。即便如此,还是将其声明为常数,因为要大声喊叫。

如果您正在构建 32 位,NSInteger 是一个 32 位有符号值。所以你很可能会溢出。我不确定在这种情况下 NSUserDefaults 的行为是什么,但值得考虑。

【讨论】:

  • 您一眼就认出它是 1
【解决方案2】:

此类问题的另一个常见原因是使用将值存储为用户默认值的自定义设置器。如果您这样做,并且如果您不小心只访问用户默认代码中的 ivars,则在阅读它们时可能会踩到存储的首选项。

【讨论】:

    【解决方案3】:

    您将双精度值传递给需要整数的东西。通常,您会期望发生一些截断,并以 int 结尾,但您不能保证 setInteger:forKey: 方法会为您执行此操作。

    为什么要将滑块值乘以那个明显任意的数字?

    编辑:

    再解释一下我的回答:

    为了将数字存储在默认值中,需要将它们包装在 NSNumber 对象中。 setInteger:forKey 等是方便的方法,它们可能只是获取您的整数并使用 numberWithInt: 从它创建一个 NSNnumber。我不能 100% 确定,因为我没有看过 Apple 的代码,但我假设将双精度传递给 numberWithInt: 将返回 nil,因为双精度不是 int。

    【讨论】:

    • 我乘以它的原因是因为滑块需要定义我的应用程序可以使用多少空间,在我的情况下以字节为单位定义,但我需要它以 GB 1 字节乘以 8589934592 等于1GB。然后我将文件夹大小(也以字节为单位,所以我需要再次乘以它)与滑块一比较,以查看是否已达到限制。我应该使用什么来代替 setIntegerForKey?只需使用 setObjectForKey?
    • 我建议从您的最终双精度值创建一个NSNumber 对象,使用numberWithDouble:,然后使用setObject:forKey。
    • setInteger 接受一个 NSInteger。我很确定编译器应该自动进行转换;该对象将不会收到双倍。不明确表达可能不是很好的形式,但我不认为这是一个错误。
    • walky 所说的——你不必知道 Apple 的代码,它是一个 语言 功能。
    • 编译器根本没有显示任何警告,我尝试创建自己的子类-(void)setDouble:(double)dou forKey:(id)key 和-(double)doubleForKey:(id)key,但结果仍然相同,即使我使用了 NSNumber
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    相关资源
    最近更新 更多