注意:请在使用或关闭之前完整阅读该问题。
我有一个字典packedData
,其中NSNumber
类型&的值为'1'。关键的“例子”。我将此值保存为核心数据
myentity.attribute = [packedData valueForKey:@"example"]; //attribute is of NSNumber type as well.
当我获取数据时,返回的值是“23008”或其他一些不相关的值。我对其进行了调试,发现在将其保存到核心数据时,这是一个价值转换问题。
有谁知道为什么会这样或者它的解决方案?
更新:NSString和NSDate类型保存得很好(与字典中的确切值一样)。
答案 0 :(得分:0)
如果你有"使用标量属性"为整数类型属性选择,生成的代码类似于
@property (nonatomic) int16_t attribute;
如果取消选中,代码看起来像
@property (nullable, nonatomic, copy) NSNumber *attribute;
第一种情况是原始整数类型;第二个是核心数据将视为包含整数的NSNumber
对象。
您的代码行如下所示:
myentity.attribute = [packedData valueForKey:@"example"];
valueForKey
调用将返回一个对象,在您的情况下为NSNumber
。但是NSNumber
和标量类型之间没有自动转换。因此,如果您使用标量版本,则最终会分配NSNumber
的指针值。也就是说,您获得NSNumber
的内存地址,而不是它包含的值。
您可以通过
解决此问题NSNumber
。保持标量类型,然后更改代码行以将对象转换为整数值:
newEvent.attribute = [[packedData valueForKey:@"example"] integerValue];
编译器应该已经警告过你了!我本来希望看到incompatible pointer to integer conversion assigning to 'int16_t' (aka 'short') from 'id _Nullable'
之类的警告。