NSNumber如何在磁盘上显示?

时间:2012-04-22 00:40:53

标签: objective-c

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

3 个答案:

答案 0 :(得分:7)

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

请参阅Tagged pointers and fast-pathed CFNumber integers in Lion

答案 1 :(得分:4)

NSNumberNSObject的后代,因此它可以转到id可以去的任何地方:NSarrayNSDictionary,依此类推。 intdouble等基元不能进入这些类,因为它们不会从NSObject继承,因此无法参与集合等。

如果我猜测NSNumber的内部。我会说它是一个联合和一个类型选择器字段。然而,封装的美妙之处让我成功地编程到NSNumber而不知道它的表示的第一件事(并且没有遗漏那些知识)。

答案 2 :(得分:1)

要记住的一件事是Objective-C是C的超集,因此他们没有决定使用原始类型的NSNumber 而不是(float,加倍,等等,但加上。如果您不需要NSNumber的功能,那么只需使用基元类型并节省创建/销毁对象的开销。 iOS中的许多函数(特别是数组类型函数)使用对象NSObject的后代)。因此,如果要将某种类型的数字传递给其中一个函数,则需要对其进行对象表示。这是NSNumber的用武之地。

引用NSNumber上的文档:

  

NSNumber是NSValue的子类,它提供任何C标量的值   (数字)类型。它定义了一组专门用于设置的方法   并将值作为有符号或无符号的char,short int,int,   long int,long long int,float或double或BOOL。 (注意   数字对象不一定保留它们的创建类型   用。)它还定义了一个compare:方法来确定排序   两个NSNumber对象。

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

至于将其存储到磁盘,如果您需要执行此操作,则通常使用encodeWithCoder存储它并使用initWithEncoder检索它,并将其转换为要保存到磁盘的格式,后来回读了。