integerForKey:始终返回零

时间:2010-06-22 09:38:14

标签: cocoa macos integer nsuserdefaults

我正在尝试从我的首选项文件中检索一个整数值。有趣的是,它总是返回零,虽然它确实存在,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];
}

3 个答案:

答案 0 :(得分:3)

8589934592是一个硬编码的字面值? 真的吗?你至少应该输入像1 << 33这样的东西。即使这样,也要宣布它是一个常数,因为大声喊叫。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

你正在将一个double传递给需要整数的东西。通常情况下,您会发生一些截断,并最终得到一个int,但您无法保证setInteger:forKey:方法正在为您执行此操作。

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

编辑:

再解释一下我的答案:

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

相关问题