NSNumber 和 NSValue 的部分使用

时间:2021-10-19 07:14:45

1.NSNumber

在Objective-c中有int,float,char等基本数据类型,但这些基本数据类型并不是对象,而数组,字典,字符串等容器中存放的都是对象类型,因此我们需要用到NSNumber类型.

NSNumber就是数字对象,我们可以使用NSNumber对象来创建和初始化不同类型的数字对象。

<1>NSNumber类型的创建(关键词:都是以numberWith....开头+改变的数据的基本数据类型)

创建integer类型对象

NSNumber *intNumber = [NSNumber numberWithInteger:123];

NSLog(@"%i",[intNumber integerValue]);

创建long类型对象

NSNumber *myNumber = [NSNumber numberWithLong:0xababab];

NSLog(@"%lx",[myNumber longValue]);

创建char类型对象

NSNumber *myNumber = [NSNumber numberWithChar:'K'];

NSLog(@"%c",[myNumber charValue]);

<2>NSNumber类型转换为基本数据类型(关键词:NSNumber数据的名称+...value)

int i=[intNumber intValue];
 
if(intNumber isEqualToNumber: floatNumber){
}
NSNumber继承NSObject ,可以使用比较 compare: isEqual等消息.

2.NSValue

在C开发中常会用到结构体来帮助我们简单封装基本数据类型,在Objective-C中也可以使用结构体来完成数据类型的封装。

同时,Cocoa Touch还提供了一个NSValue来帮助我们更好地在开发中使用结构体。 我们可以使用NSValue来辅助我们实现一些简单数据结构的封装。

比如:定义了一个简单的结构体类型

-----------------------------------------------------------------------------

  typedef struct {

int id,

float height,

unsigned char flag

  }MyTestStruct;   //就可以使用MyTestStruct这个结构体来封装数据

-----------------------------------------------------------------------------

   MyTestStruct   myTestStruct;  //创建一个MyTestStruct类型的数据

myTestStruct.id=1;      //赋值

myTestStruct.height=23.0;

myTestStruct.flag='A';

NSValue *value = [NSValue valueWithBytes:&myTestStruct objCType:@encode(MyTestStruct)];

------------------------------------------------------------------------------------------------------------------

在我们想取出*value中的数据时,可以使用如下方式:

   MyTestStruct theTestStruct;  //创建新的MyTestStruct类型的数据来接收数据

    [value getValue:&theTestStruct];

  之后就可以对theTestStruct的操作来取得其中的数据.

  对于NSValue 类的使用,还有一个地方就是我们在iPhone显示点或者其它几何图形时。比如我们想取得用户在屏幕上的点击轨迹,此时首先我们想到的就是使用CGPoint这个结构体来保存每一次点击的数据。此时,我们就可以使用NSValue类别中的+valueWithCGPoint:来帮助我们来为CG Framework提供数据.