Objective-C(Cocoa)中NSNumber、NSValue,NSNull类的简单应用
来源:互联网 发布:兄弟连python视频下载 编辑:程序博客网 时间:2024/05/16 07:03
我们回顾一下,NSArray和NSDictionary只能存储对象,而不能直接存储任何基本类型的数据,如int、float和struct。不过,我们可以用对象来封装基本数值。如果我们想使用对象来处理基本类型,就可以使用NSInteger和NSUInteger。这些数据也要针对32位和64位处理器对数值进行统一。首先,让博主带大家先看一下用到的知识内容(有关Cocoa中的NSNumber、NSValue、NSNull类):
1、Cocoa提供了NSNumber类来封装(wrap,即以对象形式来实现)基本数据类型。我们可以使用下面类方法来创建新的NSNumber对象:
+(NSNumber *)numberWithChar:(char)value;+(NSNumber *)numberWithInt:(int)value;+(NSNumber *)numberWithFloat:(float)value;+(NSNumber *)numberWithBoll:(BOOL)value;
以上使我们最常用的方法,还包括无符号整数,long型整数以及long long型整数据的版本。
当然,也可以使用字面量语法来创建这些对象:
NSNumber *number;number = @'S';//字符型number = @12345;//整型number = @12345ul;//无符号长整数number = @12345ll;//long longnumber = @123.45f;//浮点型number = @123.45;//双浮点型number = @YES;//布尔值
在将一个基本类型数据封装到NSNumber中后,我们可以通过下面的实例方法来重新获得它:
-(char)charValue;-(int)intValue;-(float)floatValue;-(BOOL)boolValue;-(NSString *)stringValue;
现在,让博主和大家一起学习一下普及一下知识:
通常将一个基本类型的数据封装成对象的过程被称为装箱,从对象中提取基本类型的数据叫做开箱。有些语言有自动装箱的功能,可以自动封装基础类型的数据,也可以自动从封装后的对象中提取基础数据。Objective-C语言不支持自动装箱功能。
2、NSNumber实际上是NSValue的子类,NSValue可以封装任意值。我们可以使用NSValue将结构体放入NSArray和NSDictionary中。使用下面的类方法便能创建新的NSValue对象
+(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
传递的参数是我们想要封装的数值的地址(如一个NSSize或我们自己的struct)。通常我们得到的是想要存储的变量的地址(在C语言要使用操作符&)。我们也可以提供一个用来描述这个数据类型的字符串,通常用来说明struct中实体的类型和大小。还好,我们不用自己写代码来生成这个字符串,@encode编译器指令可以接受数据类型的名称并为我们生成合适的字符串,如下的小程序例子。
可以用方法getValue:来提取数值:
-(void)getVslue:(void *)buffer;
小提示:在上面的getValue:方法中,我们可以看到方法名中是要不管了get,表明我们提供的是一个指针,而指针所指向的空间则用来存储该方法生成的数据。
Cocoa提供了常用的struct型数据NSValue相互转换的便捷方法:
+(NSValue *)valueWithPoint:(NSPoint)aPoint;+(NSValue *)valueWithSize:(NSSize)size;+(NSValue *)valueWithRect:(NSRect)rect;-(NSPoint)pointValue;-(NSSize)sizeValue;-(NSRect)rectValue;
3、我们曾提过不能在集合中放入nil值,因为NSArray和NSDictionary中nil有特殊的意义,但有时你需要存储一个表示“这里什么都没有”的值,如下的程序应用。NSNull大概是Cocoa里最简单的类了,而且它只有一个方法:
+(NSNull *)null;
博主就分享一下学习NSNumber,NSValue,NSNull时自己编写的一些小程序:
#import <Foundation/Foundation.h>@interface Xiaojin : NSObject@end@implementation Xiaojin-(NSString *)description{ return @"I am jinge";}@endint main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... //NSNumber的应用 NSMutableArray *array = [NSMutableArray arrayWithCapacity:20]; NSNumber *number; number = @12; [array addObject:number]; number = @13; [array addObject:number]; number = @14; [array addObject:number]; for(NSInteger i = 0;i < [array count];i++) { NSLog(@"index %ld has %@",(long)i,array[i]); } int n; for(NSInteger i = 0;i < [array count];i++) { number = [array objectAtIndex:i]; n = [number intValue]; NSLog(@"The number(int) of the array[%ld] is %d",(long)i,n); } //NSValue的应用 NSMutableArray *arrays = [NSMutableArray arrayWithCapacity:20]; NSRect rect = NSMakeRect(1, 2, 30, 40); NSValue *value = [NSValue valueWithBytes:&rect objCType:@encode(NSRect)]; [arrays addObject:value]; rect = NSMakeRect(2, 3, 40, 50); value = [NSValue valueWithBytes:&rect objCType:@encode(NSRect)]; [arrays addObject:value]; rect = NSMakeRect(3, 4, 50, 60); value = [NSValue valueWithBytes:&rect objCType:@encode(NSRect)]; [arrays addObject:value]; for(NSInteger i = 0;i < [arrays count];i++) { value = [arrays objectAtIndex:i]; [value getValue:&rect]; NSLog(@"x = %f,y = %f,width = %f,height = %f",rect.origin.x,rect.origin.y,rect.size.width,rect.size.height); } //NSNull的应用 Xiaojin *t = [Xiaojin new]; NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:20]; [dictionary setObject:[NSNull null] forKey:@"xiaojin"]; [dictionary setObject:t forKey:@"jinge"]; id xiaojinfax = [dictionary objectForKey:@"xiaojin"]; if(xiaojinfax == [NSNull null]) { NSLog(@"no xiaojin"); } } return 0;}
这段程序代码运行结果截图:
这是博主学习NSNumber、NSValue和NSNull类时看的内容以及自己写的小程序,做到通过练习来巩固知识。谢谢读者们的阅览,有重要的补充和不足也希望能提出。
- Objective-C(Cocoa)中NSNumber、NSValue,NSNull类的简单应用
- Objective-C的数值类NSNumber、NSValue、NSNull
- Objective-C中使用NSValue、NSNull、NSNumber、NSDecimalNumber、NSData、NSMutableData
- Objective-C中使用NSValue、NSNull、NSNumber、NSDecimalNumber、NSData、NSMutableData 小结
- Objective-C边学边记-10:Foundation Kit快速教程之 各种数值(NSNumber,NSValue,NSNull
- Objective-C之Foundation框架NSNumber、NSNull、NSValue、NSDate用法介绍
- 黑马程序员——Objective-C学习之NSNumber\NSValue\NSNull
- Objective-C(十、NSRange,point,size,rect,NSNumber,NSValue,NSNull)——iOS开发基础
- OC--NSValue、 NSNumber、NSNull、NSDate的使用
- 数值类对象:NSNumber,NSValue,NSNull
- 数值类对象:NSNumber,NSValue,NSNull
- NSNumber,NSValue,NSNull
- NSNumber、NSValue和NSNull
- NSNumber NSValue NSNull NSDate
- NSNUmber,NSValue,NSNull
- Objective-C 10 NSValue和NSNull使用方法
- 5. 18 Objective-C 常用数据类型(NSValue NSNumber NSString )的方法
- 【Objective-C基础】NSNumber,NSValue和NSData
- 保存数据时报:Incorrect string value: '\xF0\x9F\x91\x8D' for column 'f_char_name' at row 1
- 挥手夕阳无限美-15年终总结
- 几种常用 css3 选择器解释
- Hadoop族 版本变化
- HTML5拓扑图形组件设计之道(一)
- Objective-C(Cocoa)中NSNumber、NSValue,NSNull类的简单应用
- C++中this指针的用法详解
- dimension and x,y,z components
- 【CSS3】不错的博客
- 宋朝的货币战争
- bzoj1042: [HAOI2008]硬币购物
- zoj2156(分组背包)
- centos7.0 阿里巴巴学生服务器搭配环境实录(3)--mysql环境搭建
- 人们习惯给人贴标签是为了节约认知资源