NSNumber和NSInteger有什么区别?

时间:2009-08-16 19:15:07

标签: iphone objective-c nsnumber primitive-types nsinteger

NSNumber和NSInteger有什么区别?我应该知道更多这样的原始人吗?有一个花车吗?

5 个答案:

答案 0 :(得分:59)

NSNumber是一个类,而不是一个原语,在需要将原始数字放入字典,数组或以其他方式封装它们时使用。 NSIntegerNSUIntegerCGFloat等是简单类型,并且与intunsigned int和{{1}对应(在iPhone等32位系统上) }}

作为一般规则,如果您需要在某处存储号码,请使用float。如果您正在进行计算,循环等,请使用NSNumberNSIntegerNSUInteger

您可以将CGFloat打包成NSInteger

NSNumber

......然后回来:

NSNumber *aNumber = [NSNumber numberWithInteger:21];

您可以在此处找到更多信息:http://iosdevelopertips.com/cocoa/nsnumber-and-nsinteger.html

答案 1 :(得分:51)

现有答案很有用;添加到他们:

是的,NSUInteger给出正整数范围的两倍NSInteger,但我认为在两者之间进行选择的另一个关键原因就是区分,其中负值根本不是有意义

示例: NSArray的{​​{1}}方法的返回值是count,这是有道理的,因为我们不能有一个负数的数组元素。当编码器知道它是未签名的时,他/她有更多的自由来执行在签名情况下可能不可靠的操作,包括诸如移位之类的按位操作。 This blog post更多地谈论签名与未签名。

我对 NSUInteger vs CGFloat (不存在)的猜测:可能是NeXTStep命名代码元素的设计者根本没有做到的情况t需要在时间间隔之外指定太多的浮点值。所以他们给了NSFloat,这是一个浮点类型,但显然是用于时间间隔。而且,坦率地说,拥有这种类型是很棒的,因为你知道它总是意味着在几秒钟内不必处理结构。当你进入图形世界(Core Graphics所在的地方)时,突然浮在你身边,徘徊在空中(哈哈)。因此在那里引入NSTimeInterval是有意义的。这一段都是“受过教育的猜测。”

另外,为了清楚为什么你可以使用CGFloat等而不是原始类型:因为这样可以更容易地编写充分利用机器架构的可移植代码。例如,NSInteger在某些机器上使用32位,在其他机器上使用64位,这在很大程度上取决于这些机器上这些机器的效率差距。在某些情况下,使用32位和64位没有真正的加速,所以你不妨使用64位。如果您已将事物声明为CGFloat,那么当您重新编译时,您会突然获得“免费”的额外精度。

而且,正如iKenndac指出的那样, CGFloat是所有这些(以及其他原始或准基本类型,如NSNumber)的包装类,它启用您可以将其包含在BOOLNSArray中,更轻松地归档,并执行NSDictionary可以执行的其他操作。

答案 2 :(得分:6)

NSInteger就像C中的传统int一样。它是一个typedef。还有其他像NSUIntegerCGFloat等,它们都是原始类型的同义词。

当您需要将数字粘贴到NSArray或NSDictionary中时,NSNumber非常有用。标准做法是使用这些集合而不是滚动自己的集合;缺点是它们只能包含Objective-C对象。

NSNumber基本上将int(或float等)包装到一个Obj-C对象(类似于C#/ Java的'boxing'原始类型的概念)中,可以添加到数组中:

NSArray * myArray = [[NSArray alloc] init];
[myArray addObject:3]; // invalid, will not compile.
[myArray [NSNumber numberWithInt:3]]; // ok

出于性能原因,如果可以的话,使用原始类型(如int,float,int [])。但是,有时您无法避免NSArray / NSNumber,例如当您在.plist文件中读取或写入条目时。

答案 3 :(得分:2)

NSNumber通常用于存储变量,NSUInteger用于算术

您可以通过执行以下操作将NSNumber更改为NSUInteger:

NSNumber *variable = @1;
NSUInteger variableInt = [variable unsignedIntegerValue];

之前已经说过,但作为一般经验法则,需要用*定义的变量是Objective C类,而不需要*的变量是C原语。

答案 4 :(得分:0)

如前所述,NSNumberNSObject子类。它不是C原语(,如int,unsigned int,float,double等。NSIntegerCGFloatNSUInteger是简单的{{1}在C原语上。

typedefs的需求源于需要使用数字作为需要对象的API的参数。例如,当您想要在NSNumber,核心数据或NSArray中存储数字时。

我应该知道更多这样的原始人吗?好吧,NSDictionary不是原始类型,它包含各种数字(浮点数,整数类型,布尔值等)。您还应该了解NSValue,它是NSNumber的基础。

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

NSNumber

或者您可以使用CoreGraphics原始类型CGFloat。