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类时看的内容以及自己写的小程序,做到通过练习来巩固知识。谢谢读者们的阅览,有重要的补充和不足也希望能提出。

0 0