好的,这就是我的情况:
我有一个核心数据生成类Quantity,其中一个属性为'Value',标记为float。
Quantity类中有一个方便的方法可以帮助我设置这个属性:
- (void)setValueValue:(float)value_ {
[self setValue:[NSNumber numberWithFloat:value_]];
}
现在,当我设置尝试从这样的控制器设置此值时,
Quantity *q = (Quantity *) [NSEntityDescription insertNewObjectForEntityForName:@"Quantity" inManagedObjectContext:self.managedObjectContext];
float qv = 100.0f;
[q setValueValue:qv];
该值设置为 1.40129846e-43
我在上面的两个位置放置了断点,虽然工具提示在Controller类中正确显示值为100.0,但它在setter方法中显示的值不正确。
最终,存储在对象和db中的值是不正确的值。
关于这里发生了什么的任何线索?
答案 0 :(得分:8)
1.40129846e-43
是一个非常有趣的数字,并告诉我们这里发生了什么。
具体做法是:
1.40129846e-43 = 100 * 2^-149
更简单地说,如果您将整数值100
解释为float
的编码,那么您所观察到的值就是您所获得的。
最有可能发生的事情是您没有包含声明setValueValue:(float)
方法的标头,或者声明在您调用方法的位置不在范围内。这导致编译器假定该方法采用整数参数而不是浮点参数。
因此,调用者将您的100.f
值转换为整数100
,然后由函数将其解释为您正在观察的浮点数的编码。
另一种可能性是在您的记录代码中的某处发生类似的阻抗不匹配。
TLDR:确保在使用基于C语言的语言之前声明函数。
答案 1 :(得分:0)
除了发生命名冲突的可能性之外,您发布的代码没有任何问题。动态访问器的名称为setValue:
,因此setValueValue:
可能会使运行时混乱。
但是,很可能,您正在查看日志记录错误,即数据很好,您只是错误地显示它。如果您使用格式错误的NSLog,您将获得非常大的无意义输出。