NSNumber 和 NSInteger 有什么区别?我应该知道更多像这样的原语吗?有花车用的吗?
5 回答
NSNumber
是一个类,而不是原语,当您需要将原始数字放入字典、数组或以其他方式封装它们时使用。NSInteger
, NSUInteger
, CGFloat
, 等是简单类型并且对应(在 iPhone 等 32-bt 系统上)int
,unsigned int
和float
.
作为一般规则,如果您需要在某处存储数字,请使用NSNumber
. 如果您正在进行计算、循环等,请NSInteger
使用NSUInteger
或CGFloat
.
您可以将一个包装NSInteger
成一个NSNumber
:
NSNumber *aNumber = [NSNumber numberWithInteger:21];
...并取回它:
NSInteger anInteger = [aNumber integerValue];
你可以在这里找到更多信息:http: //iosdevelopertips.com/cocoa/nsnumber-and-nsinteger.html
现有的答案很有用;添加到他们:
是的,NSUInteger
正整数之间的范围是 的两倍NSInteger
,但我认为在两者之间进行选择的另一个关键原因只是为了区分负值根本没有意义的情况。
示例:NSArray
'方法的返回值count
是 an NSUInteger
,这是有道理的,因为我们不能有一个包含负数元素的数组。当编码人员知道它是无符号的时,他/她就有更多的自由来执行在有符号情况下可能不可靠的操作,包括移位等按位操作。 这篇博客文章更多地讨论了签名与未签名。
我对CGFloat
vsNSFloat
的猜测(不存在):可能是 NeXTStep 命名代码元素的设计者根本不需要在时间间隔之外指定太多浮点值。所以他们给出了NSTimeInterval
,这是一种浮点类型,但这显然是为了与时间间隔一起使用。而且,坦率地说,拥有这种类型真是太好了,因为您知道它总是意味着在几秒钟内完成,而不必处理结构。当你进入图形世界(Core Graphics 所在的地方)时,突然漂浮在你周围,在空中盘旋(哈哈)。因此,在此处引入 a 是有意义的CGFloat
。这一段都是“有根据的猜测”。
另外,只是为了清楚为什么您可能使用NSInteger
etc 而不是原始类型:因为这样更容易编写充分利用机器架构的可移植代码。例如,aCGFloat
在某些机器上使用 32 位,而在其他机器上使用 64 位,这在很大程度上取决于这些机器上对于这些尺寸的效率差距有多大。在某些情况下,使用 32 位与 64 位并没有真正的加速,因此您不妨使用 64 位。如果您将事物声明为CGFloat
's,那么当您重新编译时,您会突然“免费”获得额外的精度。
而且,正如iKenndac所指出的,NSNumber
它是所有这些(以及其他原始或准原始类型,如s可以。BOOL
NSArray
NSDictionary
NSObject
NSInteger 就像int
C 中的传统。它是一个 typedef。还有其他像NSUInteger
,CGFloat
等都是原始类型的同义词。
当您需要将数字粘贴到 NSArray 或 NSDictionary 中时,NSNumber 很有用。标准做法是使用这些集合而不是滚动您自己的集合;缺点是它们只能包含 Objective-C 对象。
NSNumber 本质上将一个int
(或浮点数等)包装到一个可以添加到数组中的 Obj-C 对象(类似于 C#/Java 的“装箱”原始类型的概念):
NSArray * myArray = [[NSArray alloc] init];
[myArray addObject:3]; // invalid, will not compile.
[myArray [NSNumber numberWithInt:3]]; // ok
出于性能原因,如果可以,请使用原始类型(如 int、float、int[])。但是,有时您无法避免 NSArray/NSNumber,例如当您在.plist
文件中读取或写入条目时。
NSNumber 一般用于存储变量,NSUInteger 用于算术运算
您可以通过执行以下操作将 NSNumber 更改为 NSUInteger:
NSNumber *variable = @1;
NSUInteger variableInt = [variable unsignedIntegerValue];
之前已经说过,但作为一般经验法则,需要用 * 定义的变量是 Objective C 类,而不需要 * 的变量是 C 原语。
正如其他人之前所说,NSNumber
是一个NSObject
子类。它不是 C 原语(如 int、unsigned int、float、double 等)NSInteger
,比 C 原语CGFloat
简单NSUInteger
。typedefs
需要NSNumber
使用数字作为需要对象的 API 的参数。例如,当您想将数字存储在NSArray
、Core-Data 或NSDictionary
.
我应该知道更多像这样的原语吗?嗯,NSNumber
它不是原始类型,它包含各种数字(浮点数、整数类型、布尔值等)。您还应该了解 NSValue,它是NSNumber
.
有花车用的吗?浮点数没有“NS”类型定义,但NSNumber
可以环绕任何浮点数:
NSNumber *myPi = [NSNumber numberWithFloat:3.1415926];
或者您可以使用 CoreGraphics 原始类型 CGFloat。