Cocoa - 为什么使用NSInteger和CGFloat而不是使用int和float,或者总是使用NSNumber?

时间:2011-11-09 01:43:18

标签: cocoa math floating-point int

当你不得不处理除了简短计算之外的其他数字时,使用NSNumber会不会浪费时间和精力?

最好的方法是什么?

4 个答案:

答案 0 :(得分:4)

  

当你不得不处理除了简短计算之外的其他数字时,使用NSNumber会不会浪费时间和精力?

嗯,NSNumber通常必须通过分配和引用计数箍来创建,因此比在堆栈上创建浮点花费更长的时间。

同样,NSNumber是一个不可变类型,因此经常设置它并没有多大意义,因为每次更改时,都必须分配一个新实例。他们做了一些优化,但相对于在堆栈上创建浮点数而言,它仍然是巨大的开销。与其他方式相比,使用内置函数所需的内存比NSNumber更少。

  

最好的方法是什么?

我只使用内置(例如floatint),除非我需要NSNumberDetails and rationale here

答案 1 :(得分:1)

使用适合您任务的任何一种

例如,如果您正在计算绘图用途,请使用CGFloat,因为这就是使用它。

另一方面,NSNumber非常适合需要多个数字表示的情况(例如,你需要使用float和int)。

答案 2 :(得分:1)

NSIntegerNSUIntegerCGFloat等是简单类型,对应于int,unsigned int和float。 NSNumber是Objective-C类,是NSValue的子类,具体而言。您可以使用signed或unsigned char,short int,int,long int,long long int,float,double或BOOL创建NSNumber对象。
其中一个主要区别是,您可以在需要对象的集合中使用NSNumber,例如NSArrayNSInteger只是一个整数,NSNumber是一个对象 出于性能原因,如果可以,请使用原始类型(如int,float)。但是,有时您无法避免NSNumber

答案 3 :(得分:0)

使用NSInteger& CGFloat允许您的代码在所有体系结构(32/64位)上正常运行。如果使用int / float并为64位体系结构编译代码,则可能无法在32位系统上正常运行。此外,如果Apple发布了128位系统,你的NSInteger / CGFloat代码也会在那里工作(假设Apple更新了NSInteger& CGFloat的定义,他们可能会这样做。)

是的,总是使用NSNumber

是一个重大的时间损失