NSInteger,NSUInteger,NSNumber

Objective-C入门教程10:数字类型(NSInteger,NSUInteger,NSNumber)

柳志超博客 » Program » Objective-C » Objective-C入门教程10:数字类型(NSInteger,NSUInteger,NSNumber)html

posted in Objective-C on 2012/12/14 by liuzcjava

在Objective-C中,咱们可使用c中的数字数据类型,int、float、long等。它们都是基本数据类型,而不是对象。也就是说,不可以向它们发送消息。而后,有些时候须要将这些值做为对象使用。ios

NSInteger、NSUIntegerobjective-c

当你不知道程序运行哪一种处理器架构时,你最好使用NSInteger,由于在有可能int在32位系统中只是int类型,而在64位系统,int可能变是long型。除非不得不使用int/long型,不然推荐使用NSInteger。api

从上面的定义能够看出NSInteger/NSUInteger是一种动态定义的类型,在不一样的设备,不一样的架构,有多是int类型,有多是long类型。数组

NSUInteger是无符号的,即没有负数,NSInteger是有符号的。数据结构

NSNumber架构

有人说既然都有了NSInteger等这些基础类型了为何还要有NSNumber?
NSNumber能够将基本数据类型包装起来,造成一个对象,这样就能够给其发送消息,装入NSArray中等。app

 NSInteger intVal = 123;
 NSNumber *numberVal = [NSNumber numberWithInteger:intVal];

 NSMutableArray* array = [NSMutableArray array];
  [array addObject:intVal];    //错误,intVal不是一个对象类型
  [array addObject:numberVal]; //正确

Cocoa提供了NSNumber类来包装(即以对象形式实现)基本数据类型。post

+ (NSNumber*)numberWithChar: (char)value;+ (NSNumber*)numberWithInt: (int)value;+ (NSNumber*)numberWithDouble:(double)value;+ (NSNumber*)numberWithFloat: (float)value;+ (NSNumber*)numberWithBool: (BOOL) value;...

将基本类型数据封装到NSNumber中后,就能够经过下面的实例方法从新获取它:

- (char)charValue;- (int)intValue;- (float)floatValue;- (double)doubleValue;- (BOOL)boolValue;...

 

NSValue类

咱们说像数组这样的Foundation集合只能存储对象,不能存储像int这样的基本数据类型.可是咱们每每也会有这样的需求,例如须要将CGPoint或是CGRect这样的结构存储在集合中.一个NSValue对象是用来存储一个C或者Objective-C数据的简单容器。它能够保存任意类型的数据,好比int,float,char,固然也能够是指pointers, structures, and object ids。NSValue类的目标就是容许以上数据类型的数据结构可以被添加到集合里.这种结构转化为对象的方式,不就是java中的装箱(boxing)吗?不过在Objective-C中称为包装(wraping),相反的,从对象中解出基本类型,称为展开(unwraping),在java中叫拆箱(unboxing).

NSNumber 继承自NSObject,可以使用compare、isEqual等消息。
NSNumber是NSValue的子类。NSValue可包装任意类型值。

前面咱们也介绍了Objective-C中的一些特殊数据类型:Objective-C入门教程05:特殊数据类型
更多关于NSValue的信息能够查看官方文档:NSValue Class Reference
更多信息能够参考:Foundation Data Types Reference

相关文章
相关标签/搜索