2

似乎 Apple 鼓励使用他们的类,例如,而不是像and之类NSNumber的原始 C 类型,但有时它似乎有点矫枉过正。您何时建议使用后者而不是前者?intfloat

4

4 回答 4

4

何时使用原语

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

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

关于 NSNumber

NSNumber是 的子类,当您需要使用 API 中的对象或仅使用或之NSValue类的容器时,这很有用。NSArrayNSDictionary

因此NSNumber只是一个原始的容器。

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

于 2013-06-19T02:54:14.260 回答
3

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

问题确实应该反过来——什么时候应该使用对象包装器而不是原始值?Apple 肯定不鼓励使用NSNumber过度原始类型,除非有需要

使用的两个理由NSNumber

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

您可能想要避免的原因NSNumber

  1. 它更昂贵 - 这不是过早优化的情况,而是不使用避免作为编写故意错误代码的借口!
  2. 它是不可变的——如果你只做少量的数学,这可能会很痛苦。

请记住,诸如NSInteger,CGFloat等类型不是对象类型,只是typedef语言原始类型的方便 ';并且框架 API 充满了这些类型的使用。也许不幸的是,Apple 从未采用命名约定来区分框架值类型和对象类型。

HTH。

于 2013-06-19T03:22:14.517 回答
3

NSNumber是底层CFNumber的免费桥接类型。文档明确指出:

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

所以它是另一种方式。建议不要使用,NSNumber除非需要。文档提示它主要用于 Cocoa 属性列表和集合,例如NSArray

于 2013-06-19T03:39:52.243 回答
1

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

于 2013-06-19T02:44:22.977 回答