不知道为什么 Objective-C 决定使用 NSNumber 而不是 float、double 等。这种类型在磁盘上是如何表示的?
3 回答
NSNumber
与免费CFNumber
桥接。在最近的 Core Foundation 实现中,CFNumber
是一个标记指针。这使它可以被视为一个对象,但没有对象的所有开销。相反,该值被编码在对象指针中(实际上不是指针)。
NSNumber
是 的后代NSObject
,所以它可以去任何一个id
可以去的地方:NSarray
, NSDictionary
, 等等。诸如int
and之类的原语double
不能进入这些类,因为它们不继承自NSObject
,因此不能参与集合等。
如果我猜测NSNumber
. 我会说这是一个联合和一个类型选择器字段。然而,封装之美让我在NSNumber
不知道关于其表示的第一件事的情况下成功编程(并且不会错过这些知识)。
要记住的一件事是,Objective-C 是 C 的超集,因此他们没有决定使用原始类型(浮点、双精度等)来代替它们,而是NSNumber
在它们之外使用。如果您不需要 的功能NSNumber
,则只需使用原始类型并节省创建/销毁对象的开销。iOS 中的许多函数(尤其是数组类型函数)仅适用于对象( 的后代NSObject
)。因此,如果您想将某种类型的数字传递给这些函数之一,您需要它的对象表示。这就是NSNumber
进来的地方。
引用文档NSNumber
:
NSNumber 是 NSValue 的子类,它提供任何 C 标量(数字)类型的值。它定义了一组专门用于将值设置和访问为有符号或无符号 char、short int、int、long int、long long int、float 或 double 或作为 BOOL 的方法。(请注意,number 对象不一定保留创建它们的类型。)它还定义了一个 compare: 方法来确定两个 NSNumber 对象的顺序。
请注意,实际值在内部存储为整数或浮点数(在 Jay 描述的标记指针或对象中的联合中),具体取决于您存储的值。了解这一点很重要,因为如果您尝试存储“32.1”之类的数字,它将存储为浮点数,当您检索它时,您很可能会得到“32.09999999999999”之类的内容。
至于将其存储到磁盘,如果您需要这样做,那么您通常将其存储encodeWithCoder
并检索它,initWithEncoder
然后将其转换为旨在保存到磁盘并稍后读回的格式。