似乎Apple鼓励使用他们的课程,例如NSNumber
,而不是像int
和float
这样的原始C类型,但有时看起来有点矫枉过正。你什么时候推荐使用后者而不是前者?
答案 0 :(得分:4)
如果你需要处理你的数字(做数学,修改数值......)那么你应该使用原语,我更喜欢Cocoa typedef(NSInteger
,CGFloat
)但是你可能需要做一些特定的事情,并使用long long
或其他东西......
因此,这取决于您的偏好和用例。
NSNumber
是NSValue
的子类,当您需要处理API中的对象或甚至只使用NSArray
或NSDictionary
等容器时,这非常有用。
因此NSNumber
只是原语的容器。
如果查看documentation for NSNumber,您将看到一大堆方法从每个基本类型创建一个对象,以及一组从对象中提取原始值的方法。还有一些比较方法和有用的方法来获取字符串表示。但你会注意到它实际上只是一个原语的对象容器。
答案 1 :(得分:3)
对这个问题的任何回答都将是事实和观点的混合......
问题实际上应该是另一种方式 - 何时应该使用对象包装而不是原始值?除非有需要,否则Apple当然不鼓励使用NSNumber
而不是原始类型。
使用NSNumber
的两个理由:
NSArray
)中存储原始值(单独存储,而不是作为另一个对象的一部分)。struct
可能是更好的选择。 (MS的.NET框架使用基于值的可空基元,同时还具有基于对象的原始包装器。)您可能希望避免的原因NSNumber
:
请记住NSInteger
,CGFloat
等类型不是对象类型,只是方便的typedef
用于语言基元类型;框架API充满了这些类型的用途。也许不幸的是,Apple从未采用命名约定来区分框架值类型和对象类型。
HTH。
答案 2 :(得分:3)
NSNumber
是基础toll-free bridged的CFNumber类型。文档明确说明:
CFNumber对象并非旨在替代C标量值,不应在标量值更合适和有效的API或实现中使用。
所以它是另一回事。除非需要,否则建议不要使用NSNumber
。该文档暗示它主要用于Cocoa属性列表和集合,例如NSArray
答案 3 :(得分:1)
我通常在值为nil
时使用对象,否则我使用原始类型(除非某些API需要对象)。