关于math:Cocoa – 为什么使用NSInteger和CGFloat而不是使用int和float,或者总是使用NSNumber?

Cocoa - Why using NSInteger and CGFloat instead of using int and float or, always, NSNumber?

当你不得不处理除了短计算以外的任何数字时,使用NSNumber总是会浪费时间和精力吗?

什么是最好的方法?


When you have to deal with numbers for anything else than short computation, is it a loss of time and energy using always NSNumber?

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

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

What's the best approach?

我只使用内置函数(例如floatint),除非我需要NSNumber。详情和理由在这里。


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,例如NSArray,其中需要一个对象。 NSInteger只是一个整数,NSNumber是一个对象。
出于性能原因,如果可以,请使用原始类型(如int,float)。但是,有时你无法避免NSNumber


使用适合您的任务的任何一个。

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

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


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

是的,总是使用NSNumber是一个重大的时间损失