3

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

4

3 回答 3

7

NSNumber免费CFNumber桥接。在最近的 Core Foundation 实现中,CFNumber是一个标记指针。这使它可以被视为一个对象,但没有对象的所有开销。相反,该值被编码在对象指针中(实际上不是指针)。

请参阅Lion 中的标记指针和快速路径 CFNumber 整数

于 2012-04-22T01:30:48.967 回答
4

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

如果我猜测NSNumber. 我会说这是一个联合和一个类型选择器字段。然而,封装之美让我在NSNumber不知道关于其表示的第一件事的情况下成功编程(并且不会错过这些知识)。

于 2012-04-22T00:49:51.820 回答
1

要记住的一件事是,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然后将其转换为旨在保存到磁盘并稍后读回的格式。

于 2012-04-22T04:53:08.133 回答