Objective c NSNumber在磁盘上是如何表示的?

Objective c NSNumber在磁盘上是如何表示的?,objective-c,Objective C,不清楚为什么Objective-C决定使用NSNumber而不是float、double等。这种类型在磁盘上是如何表示的?NSNumber是NSObject的后代,因此它可以去id可以去的任何地方:NSarray,NSDictionary,等等。诸如int和double之类的原语不能进入这些类,因为它们不是从NSObject继承的,因此不能参与集合等 如果让我猜一下NSNumber的内部结构。我认为这是一个并集和一个类型选择器字段。然而,封装的美妙之处让我能够成功地编程到NSNumber,而不必

不清楚为什么Objective-C决定使用NSNumber而不是float、double等。这种类型在磁盘上是如何表示的?

NSNumber
NSObject
的后代,因此它可以去
id
可以去的任何地方:
NSarray
NSDictionary
,等等。诸如
int
double
之类的原语不能进入这些类,因为它们不是从
NSObject
继承的,因此不能参与集合等

如果让我猜一下
NSNumber
的内部结构。我认为这是一个并集和一个类型选择器字段。然而,封装的美妙之处让我能够成功地编程到
NSNumber
,而不必知道它的表示形式(也不缺少这方面的知识)。

NSNumber
CFNumber
一起使用。在最近的核心基础实现中, CFNo.是一个带标记的指针。这样可以将其视为对象,但不需要对象的所有开销。相反,该值编码在对象指针中(实际上不是指针)


请参阅。

需要记住的一点是,Objective-C是C的超集,因此他们没有决定使用原始类型(float、double等)的
NSNumber
,而是将其添加到。如果您不需要
NSNumber
的功能,那么只需使用基本类型并节省创建/销毁对象的开销即可。iOS中的许多函数(尤其是数组类型函数)仅与对象一起工作(NSObject的后代)。因此,如果要将某种类型的数字传递给其中一个函数,则需要该函数的对象表示形式。这就是
NSNumber
的作用

引用
NSNumber
上的文档:

NSNumber是NSValue的一个子类,它提供一个与任何C标量相同的值 (数字)类型。它定义了一组专门用于设置的方法 以有符号或无符号字符的形式访问值,短int,int, 长整型、长整型、浮点型、双精度型或布尔型。(注意 数字对象不一定保留其创建的类型 它还定义了一个compare:方法来确定 两个NSN数字对象

请注意,实际值在内部存储为整数或浮点数(在Jay描述的标记指针内或对象中的并集内),具体取决于存储的值。要知道这一点很重要,因为如果您尝试存储像“32.1”这样的数字,它将存储为浮点数,当您检索它时,很可能会得到像“32.0999999999”这样的数字


至于将其存储到磁盘,如果需要,则通常使用
encodeWithCoder
存储它,并使用
initWithEncoder
检索它,它将其转换为要保存到磁盘的格式,然后再读回

磁盘和它有什么关系?你的意思是“它在记忆中是如何表现的”?希望我在第一句话中读对了你的想法。假设它类似于
CFNumber
,则比联合要复杂得多,可能需要为较小的类型节省一些字节。@ughoavgfhw感谢您的编辑-事实上,您100%正确地理解了我的想法。谢谢你也提到了
CFNumber
:我只知道
CF
东西的基本知识,主要是为了在没有“桥接”类的情况下过日子。我很高兴这些知识不是(或者至少不再是)构建工作应用程序的核心要求。再次感谢您+1:但只有当数字是整数且值适合可用内存时,才会将其存储为标记指针。否则它是一个完整的对象(具有所有相关的开销)。