NSNumber和NSInteger有什么区别?

mk1*_*k12 61 iphone objective-c nsnumber primitive-types nsinteger

NSNumber和NSInteger有什么区别?我应该知道更多这样的原始人吗?浮筒有吗?

iKe*_*dac 59

NSNumber是一个类,而不是一个原始类,当您需要将原始数字放入字典,数组或以其他方式封装它们时使用.NSInteger,NSUInteger,CGFloat等都是简单类型和对应(在如iPhone 32-BT系统)来int,unsigned intfloat.

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

你可以把一个包装NSIntegerNSNumber:

NSNumber *aNumber = [NSNumber numberWithInteger:21];
Run Code Online (Sandbox Code Playgroud)

......并把它拿回来:

NSInteger anInteger = [aNumber integerValue];
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您绝对可以肯定地保证您永远不会有负数,NSUInteger会为您提供更多范围.小数应该是'double`类型(我认为没有NS/CGDouble).CGFloat来自于typedef在CoreGraphics中的事实.我不知道为什么! (2认同)

Tyl*_*ler 52

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

是的,NSUInteger给出正整数范围的两倍NSInteger,但我认为在两者之间做出选择的另一个关键原因就是区分负值只是没有意义的情况.

示例:NSArray 's count方法的返回值是a NSUInteger,这是有道理的,因为我们不能有一个负数元素的数组.当编码器知道它是未签名的时,他/她有更多的自由来执行在签名情况下可能不可靠的操作,包括诸如移位之类的按位操作. 这篇博文更多地讲述了签名与未签名.

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

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

并且,正如iKenndac指出的那样,它NSNumber是所有这些(以及其他原始或准原始类型BOOL)的包装类,它使您能够将它包含在您的NSArrays和NSDictionarys中,更容易地存档它们,并执行其他操作NSObject可以做到.


Jas*_*son 6

NSInteger就像intC中的传统一样.它是一个typedef.还有其他人一样NSUInteger,CGFloat等所有都为原始类型的同义词.

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

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

NSArray * myArray = [[NSArray alloc] init];
[myArray addObject:3]; // invalid, will not compile.
[myArray [NSNumber numberWithInt:3]]; // ok
Run Code Online (Sandbox Code Playgroud)

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