NSNumber,NSValue,NSNull

http://www.cnblogs.com/elfsundae/archive/2010/10/25/1860053.html


5.各种数值
NSArray和NSDictionary只能存储对象,而不能直接存储任何基本类型的数据,如int、float 或 struct。但是你可以用对象来封装基本数值。例如,将int型数据封装到一个对象中,然后就可以将这个对象放入NSArray或NSDictionary中了。
1)NSNumber
Cocoa提供了NSNumber类来包装(即以对象形式实现)基本数据类型。
例如以下创建方法:

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

 

 

将基本类型数据封装到NSNumber中后,就可以通过下面的实例方法重新获取它:

  
  
- ( char ) charValue; - ( int ) intValue; - ( float ) floatValue; - (BOOL) boolValue; - (NSString * ) stringValue;

 


术语:将一个基本类型的数据包装成对象叫做装箱(boxing),从对象中提取基本类型的数据叫做取消装箱或拆箱(unboxing)。Objective-C不支持自动装箱。

2)NSValue
NSNumber实际上是NSValue的子类,NSValue可以包装任意值。可使用下面的类方法创建新的NSValue:

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

 


传递的参数是你想要包装的数值的地址(如一个NSSize或你自己的struct),通常得到的是你想要存储的变量的地址(在C语言中使用操作符&).你也可以提供一个用来描述这个数据类型的字符串(参数objCType),通常用来说明struct中实体的类型和大小。不需要自己写这个字符串,@encode编译器指令可以接收数据类型的名称并生成合适的字符串。所以按照如下方式把NSRect放入NSArray中:
   
复制代码
  
  
// 将NSRect放入NSArray中 NSRect rect = NSMakeRect( 1 , 2 , 100 , 200 ); NSValue * rectValue = [NSValue valueWithBytes: & rect objCType:@encode(NSRect)]; [array addObject:rectValue]; // 使用getValue提取数值 // 传递参数为要存储这个数值的变量的地址 rectValue = [array objectAtIndex: 0 ]; [rectValue getValue: & rect];
复制代码

 

在上面的getValue: 例子中,方法名中的get表明我们提供的是一个指针,而指针所指向的空间用来存储该方法生成的数据。

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

  
  
+ (NSValue * ) valueWithPoint: (NSPoint) point; + (NSValue * ) valueWithSIze: (NSSize) size; + (NSValue * ) valueWithRect: (NSRect) rect;

 

  
  
- (NSPoint) pointValue; - (NSSize) sizeValue; - (NSRect) rectValue;

 


例如:
  
  
value = [NSValue valueWithRect: rect]; [array addObject: value]; // …. NSRect anotherRect = [value rectValue];

 

3)NSNull
因为在NSArray和NSDictionary中nil中有特殊的含义(表示列表结束),所以不能在集合中放入nl值。如要确实需要存储一个表示“什么都没有”的值,可以使用NSNull类。NSNull只有一个方法:

  
  
+ (NSNull * ) null ;

例如:
  
  
[contact setObject: [NSNull null ] forKey: @" home fax " ];
访问如下:

  
  
id homefax; homefax = [contact objectForKey: @" home fax " ]; if (homefax == [NSNull null ] { // ... }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值