Cocoa - 为啥使用 NSInteger 和 CGFloat 而不是使用 int 和 float,或者总是使用 NSNumber?
Posted
技术标签:
【中文标题】Cocoa - 为啥使用 NSInteger 和 CGFloat 而不是使用 int 和 float,或者总是使用 NSNumber?【英文标题】:Cocoa - Why using NSInteger and CGFloat instead of using int and float or, always, NSNumber?Cocoa - 为什么使用 NSInteger 和 CGFloat 而不是使用 int 和 float,或者总是使用 NSNumber? 【发布时间】:2011-11-09 01:43:17 【问题描述】:当您必须处理除短计算之外的任何数字时,总是使用 NSNumber 是否会浪费时间和精力?
最好的方法是什么?
【问题讨论】:
【参考方案1】:当您必须处理除短计算之外的任何数字时,总是使用 NSNumber 是否会浪费时间和精力?
嗯,NSNumber
通常必须通过分配和引用计数循环来创建,因此这比在堆栈上创建浮点数要长得多。
同样,NSNumber
是不可变类型,因此经常设置它并没有多大意义,因为每次它发生变化时,您都必须分配一个新实例。他们做了一些优化,但相对于在堆栈上创建浮点数仍然是巨大的开销。使用内置函数也比NSNumber
需要更少的内存。
最好的方法是什么?
除非我需要NSNumber
,否则我只使用内置函数(例如float
、int
)。 Details and rationale here.
【讨论】:
是的,但是 OP 询问NSInteger
和 CGFloat
也... NSInteger 在 32 位架构上被 typedef 到 int
和 long
在 64 位架构上。 CGFloat 在 32 位上被定义为 float
,在 64 位上被定义为 double
。因此,使用CGFloat
和NSInteger
的优势在于您可以自动获得每个平台的最佳精度。 (ios 目前是 32 位的,虽然支持双精度 it is slower)。如果您需要一个固定的整数精度,最好使用来自stdint.h 的uint16_t
等类型。【参考方案2】:
使用适合您任务的方法。
例如,如果您正在计算用于绘图的矩形,请使用 CGFloat,因为这就是矩形所使用的。
另一方面,NSNumber 非常适合需要多个表示数字的情况(即,您需要使用浮点数和整数)。
【讨论】:
好的,但是想象一下我必须存储那个浮点数(用于矩形)。最好使用 NSNumber 并在需要时将其转换为 CGFloat,还是使用 CGFloat 并将其存储在 plist 中时将其转换为 NSNumber? 在这种情况下,我会将其存储为 NSNumber。你如何使用 NSNumber 取决于你的代码,但作为一般的经验法则,我不喜欢做很多 [myNumber floatValue] 所以我可能会从 [myNumber floatValue] 创建一个 CGFloat 变量,然后在方法。使用最适合你的东西(考虑可读性、可维护性等)。就性能而言,它不太可能产生任何影响(如果您怀疑它会产生影响,请进行配置),因此它实际上归结为偏好。【参考方案3】:NSInteger
、NSUInteger
、CGFloat
等都是简单类型,对应于int、unsigned int和float。 NSNumber
是一个 Objective-C 类,具体来说是 NSValue
的子类。您可以从有符号或无符号字符、short int、int、long int、long long int、float、double 或 BOOL 创建 NSNumber
对象。
主要区别之一是您可以在需要对象的集合中使用NSNumber
,例如NSArray
。 NSInteger
是一个简单的整数,NSNumber
是一个对象。
出于性能原因,如果可以,请使用原始类型(如 int、float)。但是,有时你无法避免NSNumber
,
【讨论】:
【参考方案4】:使用 NSInteger 和 CGFloat 可以让您的代码在所有 32/64 位架构上正常运行。如果您使用 int/float 并将代码编译为 64 位体系结构,则它可能无法在 32 位系统上正确运行。此外,如果 Apple 曾经发布过 128 位系统,您的 NSInteger/CGFloat 代码仍然可以在那里工作(假设 Apple 更新了 NSInteger 和 CGFloat 的定义,他们可能会这样做)。
是的,总是使用 NSNumber 会浪费大量时间
【讨论】:
"如果您使用 int/float 并将您的代码编译为 64 位架构,它将无法在 32 位系统上运行。":代码将运行。您可能会收到警告甚至是不受欢迎的行为,但它会运行。以上是关于Cocoa - 为啥使用 NSInteger 和 CGFloat 而不是使用 int 和 float,或者总是使用 NSNumber?的主要内容,如果未能解决你的问题,请参考以下文章