Cocoa IntegerWorkey:始终返回零

Cocoa IntegerWorkey:始终返回零,cocoa,macos,integer,nsuserdefaults,Cocoa,Macos,Integer,Nsuserdefaults,我试图从我的首选项文件中检索一个值,它是一个整数。有趣的是,它总是返回零,尽管它确实存在,integerworkey:和setintegerworkey:的名称是相同的 以下是检索值的方法:[默认IntegerWorkey:@“BackUpSize”] 我在这里设置它:[defaults setInteger:[sizeSlider doubleValue]*8589934592 forKey:@“BackUpSize”] 我惊呆了。它应该会起作用……还是我在这里遗漏了什么 谢谢 编辑:默认值是

我试图从我的首选项文件中检索一个值,它是一个整数。有趣的是,它总是返回零,尽管它确实存在,
integerworkey:
setintegerworkey:
的名称是相同的

以下是检索值的方法:
[默认IntegerWorkey:@“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];
}

您正在将一个double传递给需要整数的对象。通常,您会期望发生一些截断,并以int结束,但您不能保证
setInteger:forKey:
方法会为您这样做

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

编辑:

再解释一下我的答案:


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

你将一个double传递给一个需要整数的东西。通常,您会期望发生一些截断,并以int结束,但您不能保证
setInteger:forKey:
方法会为您这样做

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

编辑:

再解释一下我的答案:



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

8589934592
是硬编码文本吗?真正地您至少应该输入类似于
1
8589934592
是硬编码文字吗?真正地您至少应该放一些类似
1的东西,这种问题的另一个常见原因是使用自定义设置程序将值存储为用户默认值。如果您这样做,并且不小心只访问用户默认值代码中的IVAR,则在读取存储的Pref时会有踩踏这些Pref的风险。

此类问题的另一个常见原因是使用将值存储为用户默认值的自定义设置器。如果您这样做,并且不小心只访问用户默认代码中的IVAR,则在读取存储的pref时,您可能会遇到踩踏这些pref的风险。

您是否验证了
默认值
不是
?方法调用
nil
return<代码>0
。默认值仅为[NSUserDefaults standardUserDefaults]…刚刚验证过,它不是零。这两个语句是否在同一个类中?您是在
integerworky:
之前还是之后发送
setInteger:forKey:
?您是正常退出应用程序,还是从Xcode终止它?setInteger:forKey:在读取它之前发生。我确实会正常退出应用程序,因为当通过xcode完成时,不会保存任何首选项。您是否验证了
默认值
不是
nil
?方法调用
nil
return<代码>0
。默认值仅为[NSUserDefaults standardUserDefaults]…刚刚验证过,它不是零。这两个语句是否在同一个类中?您是在
integerworky:
之前还是之后发送
setInteger:forKey:
?您是正常退出应用程序,还是从Xcode终止它?setInteger:forKey:在读取它之前发生。我通常会退出应用程序,因为当通过xcode完成时,不会保存任何首选项。我之所以要将其相乘,是因为滑块需要定义我的应用程序可以使用的空间量,在我的情况下,它是以字节为单位定义的,但我需要GB 1字节乘以8589934592等于1GB。然后,我将文件夹大小(也以字节为单位,因此我需要再次将其相乘)与滑块大小进行比较,以查看是否达到了限制。我应该使用什么来代替SetIntegerWorkey?只需使用setObjectForKey?我建议从最终的双精度值创建一个
NSNumber
对象,使用
numberWithDouble:
,然后使用
setObject:forKey
setInteger
获取一个NSInteger。我很确定编译器应该自动执行强制转换;该对象将不会收到双精度证书。不显式可能不是很好的形式,但我不认为这是一个错误。walky说的-你不必知道苹果的代码,这是一种语言功能。编译器没有显示任何警告,我尝试创建自己的子类
-(void)setDouble:(double)dou forKey:(id)key
-(double)doubleForKey:(id)键
但它仍然有相同的结果,即使我使用了NSnumbers,我之所以将其相乘,是因为滑块需要定义我的应用程序可以使用的空间量,在我的例子中,它是以字节定义的,但我需要以GB为单位的1字节乘以8589934592等于1GB。然后,我将文件夹大小(也以字节为单位,因此我需要再次将其相乘)与滑块大小进行比较,以查看是否达到了限制。我应该使用什么来代替SetIntegerWorkey?只需使用setObjectForKey?我建议创建一个
NSNumber