Objective-C的包装类

前言

因为Objective-C是面向对象的编程语言,但它也是C语言扩展而来的,而C语言中包括的基本数据类型(如short、int、float、double等)都不是对象,它们也不具备“对象”的特性——没有属性、方法可以被调用。

所以Objective-C提供了NSValue、NSNumber来封装C语言的基本类型,这样就可以让它们具有面向对象的特征。

三个类型

在我们进行iOS开发时,可能会遇到如下三个类型:

  1. NSInteger:大致等于long型整数。
  2. NSUInteger:大致等于unsigned long型整数。
  3. CGFLoat: 在64位平台上大致相当于double,在32位平台大致相当于float。
    我们不能被这3个类前面的NS、CG前缀迷惑了,它们并不是包装类,它们依然只是基本类型。

NSValue和NSNumber

NSValue和NSNumber都是包装类,其中NSValue是NSNumber的父类;NSValue代表了一个更通用的包装类,它可用于包装单个short、int、long、float、char、指针、对象id等数据项,通过该包装类,就可以把short、int、long、float、char、指针等添加到NSArray、NSSet等集合(这些集合要求它们的元素必须是对象)中。
NSNumber是更具体的包装类,主要用于包装C语言的各种数据类型。

NSNumber的3类方法

+numberWithXxx: 该类方法直接将特定类型的值包装成NSNumber。

-initWithXxx:该实例方法需要先创建一个NSNumber对象,再用一个基本类型的值来初始化NSNumber。

-xxxValue: 该实例方法返回该NSNumber对象包装的基本类型的值。

上面3类方法中的xxx可以代表int、char等各种基本类型。

上面3类方法中,前两类方法的功能基本相似,都是把一个基本类型的值包装成包装类的实例,相比之下,直接用类方法numberWithXxx更加简单。第3类方法则用于从包装类中取出基本类型的值。
下面的程序示范了基本类型的值与包装类之间的转换,代码如下:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
    	//调用类方法将int类型的值包装成NSNumber对象
       	NSNumber* num = [NSNumber numberWithInt : 20];
       	//调用类方法将double类型的值包装成NSNumber对象
        NSNumber* de = [NSNumber numberWithDouble : 3.4];
        NSLog(@"%d",[num intValue]);
        NSLog(@"%g",[de doubleValue]);
        //先创建NSNumber对象,再调用initWithXxx方法执行初始化
        NSNumber* ch = [[NSNumber alloc] initWithChar:'x'];
        NSLog(@"%@",ch);
    }
    return 0;
}

从上面程序中可看到,将基本类型的值转换为包装类简单的做法就是调用numberWithXxx:类方法,调用该方法时传入一个基本类型的值,该方法就会返回包装该值的包装类实例。如果需要从包装类实例中获取基本类型的值,调用xxxValue实例方法即可。

基本类型变量和包装类对象之间的转换关系如图所示:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值