Objective-C编程中的数字类型(NSInteger,NSUInteger,NSNumber)

简介:

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


NSInteger、NSUInteger


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

  从上面的定义可以看出NSInteger/NSUInteger是一种动态定义的类型,在不同的设备,不同的架构,有可能是int类型,有可能是long类型。NSUInteger是无符号的,即没有负数,NSInteger是有符号的。


NSNumber


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

1
2
3
4
5
6
  NSInteger intVal = 123;
  NSNumber *numberVal = [NSNumber numberWithInteger:intVal];
 
  NSMutableArray* array = [NSMutableArray array];
   [array addObject:intVal];     //错误,intVal不是一个对象类型
   [array addObject:numberVal];  //正确

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

+ (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类


  但是我们往往也会有这样的需求,例如需要将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可包装任意类型值。












本文转自朱先忠老师51CTO博客,原文链接: http://blog.51cto.com/zhuxianzhong/1598644,如需转载请自行联系原作者


相关文章
|
iOS开发 Swift
Objective-C编程 - 关于Block的要点
1. 首先,我们快速过一下,什么是Block? Block是一段代码,它在OC中以^开头,可以有返回值,和参数列表,但就是没有名字。 所以,你可以把它认为是匿名函数。 事实上,它和Swift中的闭包(Closure)是一样的。
1040 0
|
iOS开发
Objective-C编程 - 1. 浅谈内存分配
Objective-C语言的对象类型都必须用指针,对象所占的内存是在堆(heap)上分配的。 NSString也必须在堆上分配,因此必须用指针。 NSString *someString = @"here is the string";NSString *anotherString = someString; 上面例子的内存分布图如下:   分配在堆中的内存必须直接管理,分配在栈上用于保存变量的内存会在其栈帧弹出时自动清理。
935 0
|
iOS开发
Objective-C特有类型——id
Objective-C特有类型——id OC里,id和int、double等一样,是一个类型 不同的是: id是一个万能指针,能指向/操作任何OC对象 相当于 (NS...
767 0
|
iOS开发
【《Objective-C基础教程 》笔记ch02】(二)Boolean类型及实例
一、布尔类型         布尔类型是一种对带符号的字符类型(signed char)的类型定义,使用8位的存储空间。         通过#define指令把YES定义为1,NO定义为0,都是8位的二进制数。
1031 0