-->

的NSNumber,有什么要注意使用和保存不同的原始类型时(NSNumber, what to be

2019-10-18 06:46发布

一个NSNumber可以存储不同的原始类型,如短,整型,长,长长整型,浮点,双

但确实尺寸变化,当我这样做

@(long long)

相较于

@(int)

通过模拟CoreData模型,我使用INTEGER16,位整数,Integer64,但它有对数据库的大小的结果,因为所有的NSNumber的?

到CoreData属性,它在模型中定义INTEGER16

long long tmp = 83324;
NSNumber * numberStoringLongLong = @(tmp);
cdEntity.propertyInteger16 = numberStoringLongLong;

long long tmp2 = [cdEntity.propertyInteger16 longLongValue];

将propertyInteger16表现吧? 将TMP2有效吗?

Answer 1:

按计划你的第一个例子是行不通的 。 即使NSNumber可存储short,int和长,很长很长, 核心数据动态创建为取决于你如何定义的核心数据模型类型的属性自定义访问器。

快速测试与“整数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在整数16属性将这个值截断到17788 = 0x457C ,那就是你会得到什么,即使你使用longLongValue



Answer 2:

它不应该有所作为。 据我了解,当你分配一个NSNumber,它保留作为以代表本身所需的内存具体金额。 当您更改一个NSNumber它应该仍然占据大小相同数量的数据库中的值,而不管(一个int是同样的方式还是一个int是否将它设置为1或2147483647)什么实际价值它所持有。

我懒得去查,但是如果你在Xcode是下openDeveloperTools>仪器有一个分配的工具和泄漏的工具。 你可以运行一个for循环,故意泄露@(INT)值,然后@(LONGLONG)值,看看是否有在它的速度有多快堆消耗的差异。



文章来源: NSNumber, what to be aware of when using and storing different primitive types