当你不得不处理除了简短计算之外的其他数字时,使用NSNumber会不会浪费时间和精力?
最好的方法是什么?
答案 0 :(得分:4)
当你不得不处理除了简短计算之外的其他数字时,使用NSNumber会不会浪费时间和精力?
嗯,NSNumber
通常必须通过分配和引用计数箍来创建,因此比在堆栈上创建浮点花费更长的时间。
同样,NSNumber
是一个不可变类型,因此经常设置它并没有多大意义,因为每次更改时,都必须分配一个新实例。他们做了一些优化,但相对于在堆栈上创建浮点数而言,它仍然是巨大的开销。与其他方式相比,使用内置函数所需的内存比NSNumber
更少。
最好的方法是什么?
我只使用内置(例如float
,int
),除非我需要NSNumber
。 Details and rationale here
答案 1 :(得分:1)
使用适合您任务的任何一种。
例如,如果您正在计算绘图用途,请使用CGFloat,因为这就是使用它。
另一方面,NSNumber非常适合需要多个数字表示的情况(例如,你需要使用float和int)。答案 2 :(得分:1)
NSInteger
,NSUInteger
,CGFloat
等是简单类型,对应于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
,
答案 3 :(得分:0)
使用NSInteger& CGFloat允许您的代码在所有体系结构(32/64位)上正常运行。如果使用int / float并为64位体系结构编译代码,则可能无法在32位系统上正常运行。此外,如果Apple发布了128位系统,你的NSInteger / CGFloat代码也会在那里工作(假设Apple更新了NSInteger& CGFloat的定义,他们可能会这样做。)
是的,总是使用NSNumber
是一个重大的时间损失