NSNumber和NSInteger有什么区别?
NSNumber和NSInteger有什么区别? 还有更多我应该知道的原始图像吗? 有浮标吗?
现有的答案是有用的; join他们:
是的, NSUInteger
在NSInteger
给出了两倍于正整数的范围,但是我认为在两者之间进行select的另一个重要原因仅仅是区分负值根本没有意义的情况 。
例如: NSArray
的count
方法的返回值是一个NSUInteger
,这是有道理的,因为我们不能有一个负数元素的数组。 当编码者知道它没有签名时,他/她有更多的自由来执行在签名情况下可能不可靠的操作,包括按位操作,如移位。 这个博客文章更多地谈论签署与无签名。
我对CGFloat
vs NSFloat
(不存在)的猜测:NeXTStep命名的代码元素的devise者可能不需要在时间间隔之外指定太多的浮点值。 所以他们给了NSTimeInterval
,这是一个浮点types,但明显打算用于时间间隔。 而且,坦率地说,拥有这种types是非常好的,因为你知道它总是在几秒内完成,而不必处理结构。 当你进入graphics世界(Core Graphics居住的地方)时,突然浮游在你周围,在空中盘旋(哈哈)。 所以在那里引入一个CGFloat
是有道理的。 这一段全是“教育炒作”。
另外,要明确为什么你可以使用NSInteger
等代替原始types :因为这样可以更容易地编写可充分利用机器体系结构的可移植代码。 例如, CGFloat
在某些机器上使用32位,在其他机器上使用64位,主要取决于这些机器上这些尺寸的效率差距有多大。 在某些情况下,使用32位和64位没有真正的加速,所以你不妨使用64位。 如果你已经声明了CGFloat
的东西,那么当你重新编译的时候,你会突然获得“免费”的额外精度。
而且,正如iKenndac指出的那样, NSNumber
是所有这些(以及BOOL
等其他原始types或准原始types) 的包装类,它使您可以将它包含在NSArray
和NSDictionary
,更容易地归档它们,做NSObject
可以做的其他事情。
NSNumber
是一个类,而不是一个原始的,当你需要把原始数字放进字典,数组或者封装它们的时候使用它。 NSInteger
, NSUInteger
, CGFloat
等是简单的types,并对应(在像iPhone一样的32位系统) int
, unsigned int
和float
。
作为一般规则,如果您需要在某处存储号码,请使用NSNumber
。 如果你正在做计算,循环等,使用NSInteger
, NSUInteger
或CGFloat
。
你可以把一个NSInteger
包装成一个NSNumber
:
NSNumber *aNumber = [NSNumber numberWithInteger:21];
…并拿回来:
NSInteger anInteger = [aNumber integerValue];
你可以在这里find更多的信息: http : //iosdevelopertips.com/cocoa/nsnumber-and-nsinteger.html
NSInteger就像C中的一个传统int
。这是一个typedef。 还有一些像NSUInteger
, CGFloat
等等,都是基本types的同义词。
NSNumber在需要将数字粘贴到NSArray或NSDictionary中时非常有用。 标准做法是使用这些集合,而不是自己滚动; 缺点是它们只能包含Objective-C对象。
NSNumber基本上把一个int
(或者float等)封装到一个Obj-C对象中(类似于C#/ Java的'boxing'原始types的概念),可以添加到一个数组中:
NSArray * myArray = [[NSArray alloc] init]; [myArray addObject:3]; // invalid, will not compile. [myArray [NSNumber numberWithInt:3]]; // ok
出于性能原因,如果可以的话,使用原始types(如int,float,int [])。 但是,有时您不能避免NSArray / NSNumber,例如当您正在读取或写入条目到.plist
文件。
NSNumber一般用于存储variables,NSUInteger用于算术
你可以通过这样做把NSNumber改成NSUInteger:
NSNumber *variable = @1; NSUInteger variableInt = [variable unsignedIntegerValue];
前面已经说过,但是作为一般的经验法则,需要用*定义的variables是Objective C类,而不需要*的variables是C原语。
正如别人之前所说的, NSNumber
是一个NSObject
子类。 它不是一个C原语( 如int,unsigned int,float,double等 ) NSInteger
, CGFloat
, NSUInteger
是简单的C语言基础typedefs
。
对NSNumber
的需求源于需要使用数字作为需要对象的API的参数。 例如,当您想要在NSArray
,In-Core-Data或NSDictionary
存储一个数字时。
还有更多我应该知道的原始图像吗? 那么, NSNumber
不是一个原始types,它包裹各种数字(浮点数,整型,布尔值等)。 您还应该了解NSNumber
的基础NSValue。
有浮标吗? 浮点数没有“NS”typedef,但是NSNumber
可以包含任何浮点数:
NSNumber *myPi = [NSNumber numberWithFloat:3.1415926];
或者你可以使用CoreGraphics原始typesCGFloat。