Objective c NSNumber在磁盘上是如何表示的?
不清楚为什么Objective-C决定使用NSNumber而不是float、double等。这种类型在磁盘上是如何表示的?Objective c NSNumber在磁盘上是如何表示的?,objective-c,Objective C,不清楚为什么Objective-C决定使用NSNumber而不是float、double等。这种类型在磁盘上是如何表示的?NSNumber是NSObject的后代,因此它可以去id可以去的任何地方:NSarray,NSDictionary,等等。诸如int和double之类的原语不能进入这些类,因为它们不是从NSObject继承的,因此不能参与集合等 如果让我猜一下NSNumber的内部结构。我认为这是一个并集和一个类型选择器字段。然而,封装的美妙之处让我能够成功地编程到NSNumber,而不必
NSNumber
是NSObject
的后代,因此它可以去id
可以去的任何地方:NSarray
,NSDictionary
,等等。诸如int
和double
之类的原语不能进入这些类,因为它们不是从NSObject
继承的,因此不能参与集合等
如果让我猜一下NSNumber
的内部结构。我认为这是一个并集和一个类型选择器字段。然而,封装的美妙之处让我能够成功地编程到NSNumber
,而不必知道它的表示形式(也不缺少这方面的知识)。NSNumber
与CFNumber
一起使用。在最近的核心基础实现中,请参阅。需要记住的一点是,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:但只有当数字是整数且值适合可用内存时,才会将其存储为标记指针。否则它是一个完整的对象(具有所有相关的开销)。