2010-06-22 127 views
1

我试图从我的首选项文件,这是一个整数检索一个值。有趣的是,它总是返回零,虽然它确实存在,并且integerForKey:setIntegerForKey:的名称都是相同的。integerForKey:总是返回零

这是我如何检索值:[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]; 
} 
+1

您是否验证过'defaults'不是'nil'? “nil”方法调用返回...“0”。 – 2010-06-22 09:51:19

+1

默认值只是[NSUserDefaults standardUserDefaults] ... – Pripyat 2010-06-22 09:55:26

+1

只是验证它,它不是零。 – Pripyat 2010-06-22 09:56:18

回答

3

8589934592是硬编码文字? 真的吗?你至少应该放一些像1 << 33。即使这样,声明它是一个常数,因为大声哭泣。

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

+3

令我印象深刻的是,您将它视为1 << 33。 ☺ – 2010-06-22 10:44:52

0

你正将一个double传递给需要一个整数的东西。通常情况下,您会希望发生一些截断,并以int结尾,但您不能保证setInteger:forKey:方法可以为您做到这一点。

为什么你将滑块值乘以表面上任意的数字?

编辑:

解释我的答案多一点:

为了存储在他们需要被包裹在NSNumber对象的默认号码。 setInteger:forKey等等,都是方便的方法,可能只是取整数并使用numberWithInt:从中创建一个NSNnumber。我不能100%确定,因为我没有看到苹果的代码,但我认为传递一个到numberWithInt:的double将返回nil,因为double不是int。

+1

我之所以乘以它是因为滑块需要定义我的应用程序可能使用多少空间,在我的情况下是以字节为单位定义的,但我需要它在GB 1字节时间8589934592等于1GB。然后我比较文件夹的大小(这也是以字节为单位,所以我需要再次乘以)与滑块之一,看看是否已达到限制。我应该用什么来代替setIntegerForKey?只需使用setObjectForKey? – Pripyat 2010-06-22 10:04:09

+1

objectForKey不会工作... – Pripyat 2010-06-22 10:06:03

+1

我建议使用'numberWithDouble:',然后使用'setObject:forKey',从最终的double值创建一个'NSNumber'对象。 – Jasarien 2010-06-22 10:07:07

1

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