NSNumber 和 NSValue

  1. NSArray和NSDictionary是不支持存储基本数据类型的,所以Cocoa提供了NSNumber类用来包装基本的数据类型,如:int、char、BOOL、float..等各种有符号和无符号的基本数据类型.
  2. 我们在编码中,很多时候需要将C里面原生的数据封装成对象,这样可以用NSDictionary或者NSArray来存取访问。尤其是一些做适配的情况下,这种封装是不可避免的。Objective-C提供了不少类可以帮助我们,比较常见的是NSNumber,NSValue和NSData。
  3. NSNumber主要是用来封装ANSI C内置的数据,比如char,float,int等等。
  4. NSValue主要用来封装自定义的数据结构,可以是系统框架提供的CGRect/CGPoint/CGSize等数据结构,也可以是自己定义的struct。
  5. NSData主要是提供一块原始数据的封装,方便数据的封装与流动,比较常见的是NSString/NSImage数据的封装与传递。在应用中,最常用于访问存储在文件中或者网络资源中的数据

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;

提取数值

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

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

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

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

  • (NSPoint)pointValue;

  • (NSSize)sizeValue;

  • (NSRect)rectValue;

复制代码

  //声明并初始化一个struct
NSRect rtc = NSMakeRect(12, 32, 433, 343);
//创建一个NSValue:
//value:对象地址
//objCType:通常是一个用来描述对象类型和大小的字符串,@encode会自动生成一个合适的描述字符串
NSValue *value = [NSValue valueWithBytes:&rtc objCType:@encode(NSRect)];
//把value添加到数组中
NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];
[array addObject:value];

NSRect rt;
//从数组中取到NSValue,因为只添加了一个,所以小标是0
NSValue *v = [array objectAtIndex:0];
//从value中取得一个NSRect,虽然返回值是void,但其实是它是利用指针返回值的
[v getValue:&rt];
//输出结果
NSLog(@"%f %f %f %f", rt.origin.x, rt.origin.y, rt.size.height, rt.size.width);

//用快速枚举遍历array并输出NSValue中struct属性的值
for(NSValue *v in array)
{
    NSRect rt;
    [v getValue:&rt];
    NSLog(@"%f %f %f %f", rt.origin.x, rt.origin.y, rt.size.height, rt.size.width);
}


/便捷的struct转换成NAValue方式
//声明并初始化一个struct
NSRect rtc1 = NSMakeRect(100, 200, 300, 400);
//创建一个NSValue
NSValue *value1 = [NSValue valueWithRect:rtc1];
//把value1添加到数组中
NSMutableArray *array1 = [NSMutableArray arrayWithCapacity:10];
[array1 addObject:value1];
NSRect rt1 = [value1 rectValue];
//输出结果
NSLog(@"%f %f %f %f", rt1.origin.x, rt1.origin.y, rt1.size.height, rt1.size.width);

复制代码

NSNull

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

NSNull只有一个方法:null

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

if(EmailAdress == [NSNull null])

{

  //to do something…

}
http://blog.sina.com.cn/s/blog_a674ea9301019v9p.html
http://blog.csdn.net/sakulafly/article/details/13292457

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值