数值类对象:NSNumber,NSValue,NSNull

基本,集合,复杂,对象

可用对象封装基本数值,然后将对象放入NSArray或NSDictionary 中。

用对象封装基本数值后,即可给其发送消息。

数值类型包括:NSNumber,NSValue,NSNull类。

oc不支持自动装箱

NSNumber类

创建方法

+ (NSNumber *)numberWithChar:(char)value;

+ (NSNumber *)numberWithInt:(int)value;

+ (NSNumber *)numberWithFloat:(float)value;

+ (NSNumber *)numberWithDouble:(double)value;

+ (NSNumber *)numberWithBool:(BOOL)value;

+ (NSNumber *)numberWithInteger:(NSInteger)valueNS_AVAILABLE(10_5, 2_0);

创建类型后,就可以放入字典或数组中。

解除装箱,获取数据:

- (char)charValue;

- (int)intValue;

- (float)floatValue;

- (double)doubleValue;

- (BOOL)boolValue;

可以任意类型的转换

发送消息:

NSNumber 继承自NSObject;

可使用compare、isEqual等消息。

NSNumber是NSValue的子类。

NSValue可包装任意类型值。

泛型指针

void * 针对简单,复杂数据类型

id     可指向任意oc对象的指针

NSArray和NSDictionary是不支持存储基本数据类型的,所以Cocoa提供了NSNumber类用来包装基本的数据类型,如:int、char、BOOL、float..等各种有符号和无符号的基本数据类型

NSNumber

1、

+ (NSNumber *)numberWithChar:(char)value;

+ (NSNumber *)numberWithInt:(int)value;

+ (NSNumber *)numberWithFloat:(float)value;

+ (NSNumber *)numberWithBOOL:(BOOL)value;

...

...

创建NSNumber对象

NSNumber *number;

number = [NSNumber numberWithInt:123];

2、

- (char)charValue;

- (int)intValue;

- (float)floatValue;

- (BOOL)boolValue;

...

...

提取数值

[number intValue];

创建了NSNumber之后,就可以把它存储到NSArray或者NSDictionary中了:

NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];

[array addObject:number];//存储到数组中

可以用快速枚举遍历数组元素

for(NSNumber *num in array)

{

  NSLog(@"%c", [num intValue]);

}

NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:10];

[dic setObject:number forKey:@"1"];//存储到字典中

可以用快速枚举遍历字典元素

for(id mdic in dic)

{

  NSLog(@"%c", [[dic objectForKey:mdic] intValue]);

}

通常,将一个基本类型的数据包装成对象叫做装箱(boxing),从对象中取出基本数据类型叫做取消装箱(unboxing)

NSValue

实际上NSMunber是NSValue的子类,NSValue可以包装任意一个对象,可以用NSValue将struct存到NSArray和NSDictionary中。

1、+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;

创建一个NSValue

value:对象地址

objCType:通常是一个用来描述对象类型和大小的字符串,@encode可以接受一个数据类型的名称自动生成一个合适的描述字符串

2、- (void)getValue:(void *)value(出参);

从接受value的对象中

提取数值

提取的数值,存放在这个指针所指向的内存块里。

3、Cocoa提供了常用struct数据类型转换成NSValue的便捷方法:

+ (NSValue *)valueWithPoint:(NSPoint)point;

+ (NSValue *)valueWithSize:(NSSize)size;

+ (NSValue *)valueWithRect:(NSRect)rect;

- (NSPoint)pointValue;

- (NSSize)sizeValue;

- (NSRect)rectValue;

[cpp] view plaincopy

  1. //声明并初始化一个struct
  2. NSRect rtc = NSMakeRect(12, 32, 433, 343);
  3. //创建一个NSValue:
  4. //value:对象地址
  5. //objCType:通常是一个用来描述对象类型和大小的字符串,@encode会自动生成一个合适的描述字符串
  6. NSValue *value = [NSValue valueWithBytes:&rtc objCType:@encode(NSRect)];
  7. //把value添加到数组中
  8. NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];
  9. [array addObject:value];
  10. NSRect rt;
  11. //从数组中取到NSValue,因为只添加了一个,所以小标是0
  12. NSValue *v = [array objectAtIndex:0];
  13. //从value中取得一个NSRect,虽然返回值是void,但其实是它是利用指针返回值的
  14. [v getValue:&rt];
  15. //输出结果
  16. NSLog(@"%f %f %f %f", rt.origin.x, rt.origin.y, rt.size.height, rt.size.width);
  17. //用快速枚举遍历array并输出NSValue中struct属性的值
  18. for(NSValue *v in array)
  19. {
  20. NSRect rt;
  21. [v getValue:&rt];
  22. NSLog(@"%f %f %f %f", rt.origin.x, rt.origin.y, rt.size.height, rt.size.width);
  23. }
  24. /////////////////////便捷的struct转换成NAValue方式////////////////////////
  25. //声明并初始化一个struct
  26. NSRect rtc1 = NSMakeRect(100, 200, 300, 400);
  27. //创建一个NSValue
  28. NSValue *value1 = [NSValue valueWithRect:rtc1];
  29. //把value1添加到数组中
  30. NSMutableArray *array1 = [NSMutableArray arrayWithCapacity:10];
  31. [array1 addObject:value1];
  32. NSRect rt1 = [value1 rectValue];
  33. //输出结果
  34. NSLog(@"%f %f %f %f", rt1.origin.x, rt1.origin.y, rt1.size.height, rt1.size.width);

自定义类型

[cpp] view plaincopy

  1. typedef struct
  2. {
  3. int    id;
  4. float  height;
  5. unsigned char   flag;
  6. } MyTestStruct;
  7. MyTestStruct myTestSturct;
  8. myTestSturct.id = 1;
  9. myTestSturct.height = 23.0;
  10. myTestSturct.flag = ‘A‘;
  11. //封装数据
  12. NSValue *value = [NSValue valueWithBytes:&myTestSturct objCType:@encode(MyTestStruct)];
  13. //取出value中的数据
  14. MyTestStruct  theTestStruct;
  15. [value getValue:&theTestStruct];//可对theTestStruct操作取得其中的数据

NSNull

在集合中不能存放nil值,因为在NSArray和NSDictionary中nil有特殊的含义。但是在有些时候,确实需要用到这样的空值,比如在字典中,电话簿中"Jack"关键字下有电话号码、家庭住址、Email等等信息,但是现在只知道他的电话号码,这种不知道其他信息的情况下为了消除一些歧义,有必要将它们设置为空,所以Cocoa提供了NSNull

NSNull只有一个方法:null

[dictionary setObject:[NSNull null], forKey:"Email"];

if(EmailAdress == [NSNull null])

{

  //to do something...

}

[cpp] view plaincopy

  1. //声明并初始化一个struct
  2. NSRect rtc = NSMakeRect(12, 32, 433, 343);
  3. //创建一个NSValue:
  4. //value:对象地址
  5. //objCType:通常是一个用来描述对象类型和大小的字符串,@encode会自动生成一个合适的描述字符串
  6. NSValue *value = [NSValue valueWithBytes:&rtc objCType:@encode(NSRect)];
  7. //把value添加到数组中
  8. NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];
  9. [array addObject:value];
  10. NSRect rt;
  11. //从数组中取到NSValue,因为只添加了一个,所以小标是0
  12. NSValue *v = [array objectAtIndex:0];
  13. //从value中取得一个NSRect,虽然返回值是void,但其实是它是利用指针返回值的
  14. [v getValue:&rt];
  15. //输出结果
  16. NSLog(@"%f %f %f %f", rt.origin.x, rt.origin.y, rt.size.height, rt.size.width);
  17. //用快速枚举遍历array并输出NSValue中struct属性的值
  18. for(NSValue *v in array)
  19. {
  20. NSRect rt;
  21. [v getValue:&rt];
  22. NSLog(@"%f %f %f %f", rt.origin.x, rt.origin.y, rt.size.height, rt.size.width);
  23. }
  24. /////////////////////便捷的struct转换成NAValue方式////////////////////////
  25. //声明并初始化一个struct
  26. NSRect rtc1 = NSMakeRect(100, 200, 300, 400);
  27. //创建一个NSValue
  28. NSValue *value1 = [NSValue valueWithRect:rtc1];
  29. //把value1添加到数组中
  30. NSMutableArray *array1 = [NSMutableArray arrayWithCapacity:10];
  31. [array1 addObject:value1];
  32. NSRect rt1 = [value1 rectValue];
  33. //输出结果
  34. NSLog(@"%f %f %f %f", rt1.origin.x, rt1.origin.y, rt1.size.height, rt1.size.width);  }

[cpp] view plaincopy

  1. //函数声明,定义时,需要出现参数类型
  2. //调用函数时,不出现数据类型      /1
  3. //若出现数据类型,则为强制转换    /2
  4. NSMutableArray *kbArr;
  5. NSMutableDictionary *kbDic;
  6. NSRect stRect = {1,20,200,200};
  7. //NSValue *vlaue = [NSValue valueWithRect:stRect];
  8. //1
  9. NSValue *vlaue = [NSValue valueWithBytes:&stRect objCType:@encode(NSRect)];
  10. //2
  11. NSValue *vlaue1 = [NSValue valueWithBytes:(const void *)&stRect objCType:(const char *)@encode(NSRect)];
  12. [kbArr addObject:vlaue];
  13. [kbDic setObject:vlaue forKey:@"stRect"];

本章总结:

掌握nsnumber类的作用,实用方法。

掌握nsvalue类的作用,实用方法。

掌握nsnull类的作用,实用方法。

数值类对象:NSNumber,NSValue,NSNull,布布扣,bubuko.com

时间: 2024-10-21 01:54:54

数值类对象:NSNumber,NSValue,NSNull的相关文章

黑马程序员——Foundation框架常用类(NSNumber/NSValue)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 简介 引入:NSArray.NSSet.NSDictionary这些OC集合都只能存放OC对象,不能存放基本数据类型(int.char.double...).如果我们想将基本数据类型存到这些OC集合中,那么我们将基本数据类型(int.char.double...)包装成OC对象,那么就可以存到OC集合中.NSNumber可以将基本数据类型包装为OC对象. NSValue:用来存储一个C或者OC的

objective-c 中数据类型之五 数值类(NSNumber及NSNumberFormatter)

// 聊聊NSNumber, NSNumber可以封装c中基本数据类型 char,int,long,float,BOOL,NSInteger,CGFloat等. NSNumber *num = [NSNumber numberWithChar:'a']; NSLog(@"%@", num); // 97 num = [NSNumber numberWithInteger:97]; num = [NSNumber numberWithFloat:97.0]; num = [NSNumbe

Object - C 值对象 NSNumber和NSValue

在进行数据处理的时候,因为对象类型的不同, 并不能进行相应的数据处理,所以必须要进行数据类型的转换,这也就是NSNumber,NSValue这两类值对象出现的原因. 简而言之,NSNumber就是实现基本数据类型与对象类型的互相转换,而NSValue,则是实现结构体对象与对象类型的互相转换. NSNumber因为是实现基本数据类型与对象类型的互相转换,所以,必须是要有数据类型,而int ,char,BOOL,Float,Long,Integer等等等-都可以进行相应的转换 //1.将基本数据类型

黑马程序员--Foundation框架之--类其他常用的类:NSNumber,NSDate

------IOS培训期待与您交流! ------- Foundation的其他常用的类:NSNumber,NSDate 一.NSNumber 这个类主要是用来封装基本类型的,OC 中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去. 从这一点上我们就可以看出NSNumber是很重要的,后面一定会经常用到. 1.封包和解包 // 创建NSNumber // 封包 NSNumber *intNumber = [NSNumber numberWithI

黑马程序员_ Objective-c 之Foundation之NSNumber ,NSValue, NSDate

Objective-c 之Foundation之NSNumber ,NSValue, NSDate 1.NSNumber具体用法如下: 在Objective-c中有int的数据类型,那为什么还要使用数字对象NSNumber.这是因为很多类(如NSArray)都要求使用对象,而int不是对象.NSNumber就是数字对象,我们可以使用NSNumber对象来创建和初始化不同类型的数字对象. 此外,还可以使用实例方法为先前分配的NSNumber对象设定指定的值,这些都是以initWith开头,比如in

SSRS表格类对象

SSRS表格类对象 SSRS中的报表内容主要是通过"数据表"."矩阵"以及"列表"三种数据区域项目所建构而成的,但是在旧版SSRS中,这三种项目都有其适用功能以及使用限制,例如: n 数据表:数据列数量是固定的,但数据行却是可以动态增加且进行组合. n 矩阵:数据行与数据列都是可以动态增加的. n 列表:利用文本框以任意位置配置,适合用来呈现明细数据. 基本上,这些数据区域项目(除了列表)只能处理对称类型的报表结构,太多的限制对于企业业务报表设计

java 类对象使用

在学习反射机制时,总结一下获得类对象方式: 第一种方式:通过类本身来获得对象 Class<?> classname = this.getClass(); 或者this.class 第二种方式:通过子类的实例获取父类对象 ClassName cn = new ClassName(); UserClass = cn.getClass(); Class<?> SubUserClass = UserClass.getSuperclass(); 第三种方式:通过类名加.class获取对象 C

C++实现根据类名动态生成类对象

在开发后台服务的过程中,我们常常需要从数据库中取数据,并将数据缓存在本地中,另外,我们的服务还需要有更新数据的能力:包括定时的主动更新以及数据库数据更新时服务收到通知的被动更新. 之前在需要用到以上功能的时候,模仿着组内通用的数据Cache部分的代码来写,十分方便,基本上只需要自己写两个类:一个是取数据并缓存数据的类XXXData,一个是扇出数据的类XXXFetcher. 在需要使用数据的时候,通过: FetcherFactory::getFetcher<XXXFetcher>() 即可获取一

多继承(虚继承)派生类对象内存结构

在这里谈一下虚继承.前面写过派生类对象的内存结构,都是基于VS2010编译器的,不同的编译器对于继承的处理不同,但本质都是一样的. 虚继承是解决共享基类问题的.例如在菱形继承中 如果不使用虚继承,基类A在D中会有两个,这不仅浪费内存,还会造成歧义.使用虚继承就可以解决基类共享的问题. 要想在派生类中共享基类(例如在D对象中只有一个A对象,这时候D对象中的B对象和C对象都可以查找到A,而不是在B对象和C对象中各含有一个A对象). 先看下面一个例子: #include<iostream> usin