1

一个 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 有效吗?

4

2 回答 2

1

您的第一个示例将无法按预期工作。即使NSNumber可以存储 short、int、long 和 long long,Core Data也会动态地为属性创建自定义访问器,这取决于您在 Core Data 模型中定义类型的方式。

使用“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.

于 2013-06-14T12:41:37.480 回答
0

它不应该有所作为。据我了解,当您分配 NSNumber 时,它会根据需要保留特定数量的内存以表示自己。当您更改 NSNumber 的值时,无论它持有什么实际值,它仍然应该在数据库中占用相同数量的大小(同样的方式,一个 int 仍然是一个 int,无论它设置为 1 还是 2147483647)。

我懒得检查,但如果你在 openDeveloperTools>instruments 下的 xcode 中,有一个分配工具和一个泄漏工具。您可以运行一个 for 循环并故意泄漏 @(int) 值,然后是 @(longlong) 值,看看它消耗堆的速度是否存在差异。

于 2013-06-14T11:58:12.250 回答