NSNumber可以存储不同的基本类型,如short,int,long,long long,float,double
但是当我这样做时,尺寸会发生变化
@(long long)
与
相比@(int)
通过对CoreData模型进行建模,我使用Integer16,Integer32,Integer64,但它是否有数据库大小的结果,因为所有都是NSNumber?
到CoreData属性,该属性在模型中定义了Integer16
long long tmp = 83324;
NSNumber * numberStoringLongLong = @(tmp);
cdEntity.propertyInteger16 = numberStoringLongLong;
long long tmp2 = [cdEntity.propertyInteger16 longLongValue];
propertyInteger16会表现正常吗? tmp2会有效吗?
答案 0 :(得分:1)
您的第一个示例无法正常工作。即使NSNumber
可以存储short,int,long和long long,核心数据也会为属性创建自定义访问器
取决于您如何在核心数据模型中定义类型。
使用“Integer 16/32/64”属性的快速测试显示行为:
NSNumber *n = @(0x11223344556677);
[cdEntity setValue:n forKey:@"i16"];
[cdEntity setValue:n forKey:@"i32"];
[cdEntity setValue:n forKey:@"i64"];
NSLog(@"%@", cdEntity);
输出:
<NSManagedObject: 0x7491030> (entity: Entity; id: 0x7491090 <x-coredata:///Entity/t4521AA03-435E-4683-9EAF-ED6EED5A5E6A2> ; data: {
i16 = 26231;
i32 = 1146447479;
i64 = 4822678189205111;
})
如您所见,存储一个不符合声明大小的整数属性 该属性(静默地)截断该值。
因此,在您的示例中,将83324 = 0x1457C
存储在Integer 16属性中
将该值截断为17788 = 0x457C
,这就是您将获得的,即使您
使用longLongValue
。
答案 1 :(得分:0)
它不应该有所作为。据我了解,当您分配NSNumber时,它会根据需要保留特定数量的内存以表示自己。当你对NSNumber的值进行更改时,它应该仍然占用数据库中相同的大小,而不管它保持的是什么实际值(同样,int仍然是int,无论它是否设置为1或2147483647)。 / p>
我太懒了,但是如果你在openDeveloperTools&gt;工具下使用xcode,那就是分配工具和泄漏工具。您可以运行for循环并故意泄漏@(int)值,然后@(longlong)值,看看它消耗堆的速度是否有差异。