Objective-C(Cocoa)中NSNumber、NSValue,NSNull类的简单应用

我们回顾一下,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 long
number = @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";
}

@end

int 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值