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,否则我只使用内置函数(例如floatint)。 Details and rationale here.

【讨论】:

是的,但是 OP 询问 NSIntegerCGFloat 也... NSInteger 在 32 位架构上被 typedef 到 intlong 在 64 位架构上。 CGFloat 在 32 位上被定义为 float,在 64 位上被定义为 double。因此,使用CGFloatNSInteger 的优势在于您可以自动获得每个平台的最佳精度。 (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】:

NSIntegerNSUIntegerCGFloat等都是简单类型,对应于int、unsigned int和float。 NSNumber 是一个 Objective-C 类,具体来说是 NSValue 的子类。您可以从有符号或无符号字符、short int、int、long int、long long int、float、double 或 BOOL 创建 NSNumber 对象。 主要区别之一是您可以在需要对象的集合中使用NSNumber,例如NSArrayNSInteger 是一个简单的整数,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?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不用 * 声明 NSInteger

Cocoa 的 NSDictionary:为啥要复制密钥?

cocoa:为啥活动没有运行?

为啥 Cocoa 设计模式不再代表 Apple 文档的最佳实践?

为啥我的 Cocoa 应用程序中的某些行需要永远运行?

ios学习8_KVC和字典转模型