NSNumber和NSInteger有什么区别?

NSNumber和NSInteger有什么区别? 还有更多我应该知道的原始图像吗? 有浮标吗?

现有的答案是有用的; join他们:

是的, NSUIntegerNSInteger给出了两倍于正整数的范围,但是我认为在两者之间进行select的另一个重要原因仅仅是区分负值根本没有意义的情况

例如: NSArraycount方法的返回值是一个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) 的包装类,它使您可以将它包含在NSArrayNSDictionary ,更容易地归档它们,做NSObject可以做的其他事情。

NSNumber是一个类,而不是一个原始的,当你需要把原始数字放进字典,数组或者封装它们的时候使用它。 NSIntegerNSUIntegerCGFloat等是简单的types,并对应(在像iPhone一样的32位系统) intunsigned intfloat

作为一般规则,如果您需要在某处存储号码,请使用NSNumber 。 如果你正在做计算,循环等,使用NSIntegerNSUIntegerCGFloat

你可以把一个NSInteger包装成一个NSNumber

 NSNumber *aNumber = [NSNumber numberWithInteger:21]; 

…并拿回来:

 NSInteger anInteger = [aNumber integerValue]; 

你可以在这里find更多的信息: http : //iosdevelopertips.com/cocoa/nsnumber-and-nsinteger.html

NSInteger就像C中的一个传统int 。这是一个typedef。 还有一些像NSUIntegerCGFloat等等,都是基本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等NSIntegerCGFloatNSUInteger是简单的C语言基础typedefs

NSNumber的需求源于需要使用数字作为需要对象的API的参数。 例如,当您想要在NSArray ,In-Core-Data或NSDictionary存储一个数字时。

还有更多我应该知道的原始图像吗? 那么, NSNumber不是一个原始types,它包裹各种数字(浮点数,整型,布尔值等)。 您还应该了解NSNumber的基础NSValue。

有浮标吗? 浮点数没有“NS”typedef,但是NSNumber可以包含任何浮点数:

 NSNumber *myPi = [NSNumber numberWithFloat:3.1415926]; 

或者你可以使用CoreGraphics原始typesCGFloat。