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?
我只使用内置函数(例如float,int),除非我需要NSNumber。详情和理由在这里。
-
是的,但是OP也询问NSInteger和CGFloat ... NSInteger在32位上是int,在64位架构上是long。 CGFloat在32位上的typedefd为float,在64位上为double。因此,使用CGFloat和NSInteger的优势在于您可以自动获得每个平台的最佳精度。 (iOS目前是32位,虽然支持双精度但速度较慢)。如果需要固定的整数精度,最好使用stdint.h中的uint16_t等类型。
-
@JamieBullock感谢您添加+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,
使用适合您的任务的任何一个。
例如,如果您正在计算绘图用途,请使用CGFloat,因为这就是使用的内容。
另一方面,NSNumber非常适用于需要多个数字表示的情况(即,您需要使用float和int)。
-
好的,但想象一下我必须存储那个浮动(用于rects)。是否最好使用NSNumber并在需要时将其转换为CGFloat,或者使用CGFloat并在存储在plist中时将其转换为NSNumber?
-
在那种情况下,我会将其存储为NSNumber。你如何使用NSNumber取决于你的代码,但作为一般的经验法则我不喜欢做很多[myNumber floatValue]所以我可能会从[myNumber floatValue]创建一个CGFloat变量,然后在方法中使用它。使用最适合您的方法(考虑可读性,可维护性等)。在性能方面它不太可能有任何区别(如果你怀疑它确实如此),所以它真的归结为偏好。
使用NSInteger和CGFloat可以使代码在所有体系结构(32/64位)上正常运行。如果使用int / float并为64位体系结构编译代码,则可能无法在32位系统上正常运行。此外,如果Apple发布了128位系统,你的NSInteger / CGFloat代码也会在那里工作(假设Apple更新了NSInteger和CGFloat的定义,他们可能会这样做)。
是的,总是使用NSNumber是一个重大的时间损失
-
"如果您使用int / float并为64位体系结构编译代码,它将无法在32位系统上运行。":代码将运行。您可能会收到警告甚至是不需要的行为,但它会运行。
-
好极了,谢谢!编辑上面的回答。