OC是面向对象编程语言,但它也是从C语言扩展二来的,而C语言中包括的基本数据类型(如short、int、float、double等)都不是对象,它们也不具备“对象”的特性——没有属性、方法可以被调用。
OC提供了NSValue、NSNumber来封装C语言的基本类型,这样就可以让它们具有面向对象的特征。
它们不是包装类
进行iOS开发时,可能会遇到如下三个类型:
- NSInteger:大致等于long型整数。
- NSUInteger:大致等于unsigned long型整数。
- CGFLoat:在64位平台上大致相当于double,在32位平台上大致相当于float。
它们虽有NS、CG前缀,但它们并不是包装类,依然只是基本类型。
为了更好地兼容不同的平台,当程序需要定义整形变量时,建议使用NSInteger、NSUInteger。定义浮点型变量时,建议使用CGFloat。
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对象包装的基本类型的值。
示例:
#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: 'J'];
//直接输出NSNumber对象,使用%@格式字符串
NSLog(@"%@", ch);
}
return 0;
}
将基本类型的值转换为包装类简单的做法就是调用numberWithXxx: 类方法,调用该方法时传入一个基本类型的值,该方法就会返回包装该值的包装类实例。如果要从包装类实例中获取基本类型的值,则调用xxxValue实例方法即可。
基本类型变量和包装类对象之间的转换关系如图所示: