什么时候可以使用原始数据类型?

时间:2013-06-19 02:42:26

标签: objective-c cocoa

似乎Apple鼓励使用他们的课程,例如NSNumber,而不是像intfloat这样的原始C类型,但有时看起来有点矫枉过正。你什么时候推荐使用后者而不是前者?

4 个答案:

答案 0 :(得分:4)

何时使用原语

如果你需要处理你的数字(做数学,修改数值......)那么你应该使用原语,我更喜欢Cocoa typedef(NSIntegerCGFloat)但是你可能需要做一些特定的事情,并使用long long或其他东西......

因此,这取决于您的偏好和用例。

关于NSNumber

NSNumberNSValue的子类,当您需要处理API中的对象或甚至只使用NSArrayNSDictionary等容器时,这非常有用。

因此NSNumber只是原语的容器。

如果查看documentation for NSNumber,您将看到一大堆方法从每个基本类型创建一个对象,以及一组从对象中提取原始值的方法。还有一些比较方法和有用的方法来获取字符串表示。但你会注意到它实际上只是一个原语的对象容器。

答案 1 :(得分:3)

对这个问题的任何回答都将是事实和观点的混合......

问题实际上应该是另一种方式 - 何时应该使用对象包装而不是原始值?除非有需要,否则Apple当然不鼓励使用NSNumber而不是原始类型。

使用NSNumber的两个理由:

  1. 你需要一个物体,例如您需要在基于对象的集合(例如NSArray)中存储原始值(单独存储,而不是作为另一个对象的一部分)。
  2. 您需要一个“可空”类型,即一种表示原始值或缺少此类值的类型 - 通常在数据库中使用。请注意,在这种情况下,根据具体情况,为您的可空基元类型定义和使用您自己的基于值的struct可能是更好的选择。 (MS的.NET框架使用基于值的可空基元,同时还具有基于对象的原始包装器。)
  3. 您可能希望避免的原因NSNumber

    1. 它更贵 - 这不是过早优化的情况,而是不使用避免以此为借口写故意的错误代码!
    2. 这是不可变的 - 如果你做的数学量很少,这可能会很痛苦。
    3. 请记住NSIntegerCGFloat等类型不是对象类型,只是方便的typedef用于语言基元类型;框架API充满了这些类型的用途。也许不幸的是,Apple从未采用命名约定来区分框架值类型和对象类型。

      HTH。

答案 2 :(得分:3)

NSNumber是基础toll-free bridgedCFNumber类型。文档明确说明:

  

CFNumber对象并非旨在替代C标量值,不应在标量值更合适和有效的API或实现中使用。

所以它是另一回事。除非需要,否则建议不要使用NSNumber。该文档暗示它主要用于Cocoa属性列表和集合,例如NSArray

答案 3 :(得分:1)

我通常在值为nil时使用对象,否则我使用原始类型(除非某些API需要对象)。