NSNumber和NSInteger有什么区别?我应该知道更多这样的原始人吗?有一个花车吗?
答案 0 :(得分:59)
NSNumber
是一个类,而不是一个原语,在需要将原始数字放入字典,数组或以其他方式封装它们时使用。 NSInteger
,NSUInteger
,CGFloat
等是简单类型,并且与int
,unsigned int
和{{1}对应(在iPhone等32位系统上) }}
作为一般规则,如果您需要在某处存储号码,请使用float
。如果您正在进行计算,循环等,请使用NSNumber
,NSInteger
或NSUInteger
。
您可以将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
)的包装类,它启用您可以将其包含在BOOL
和NSArray
中,更轻松地归档,并执行NSDictionary
可以执行的其他操作。
答案 2 :(得分:6)
NSInteger就像C中的传统int
一样。它是一个typedef。还有其他像NSUInteger
,CGFloat
等,它们都是原始类型的同义词。
当您需要将数字粘贴到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)
如前所述,NSNumber
是NSObject
子类。它不是C原语(,如int,unsigned int,float,double等。)NSInteger
,CGFloat
,NSUInteger
是简单的{{1}在C原语上。
typedefs
的需求源于需要使用数字作为需要对象的API的参数。例如,当您想要在NSNumber
,核心数据或NSArray
中存储数字时。
我应该知道更多这样的原始人吗?好吧,NSDictionary
不是原始类型,它包含各种数字(浮点数,整数类型,布尔值等)。您还应该了解NSValue,它是NSNumber
的基础。
浮子有吗?浮点数没有“NS”typedef,但NSNumber
可以包围任何浮点数:
NSNumber
或者您可以使用CoreGraphics原始类型CGFloat。