OC的包装类
OC是由C语言扩展而来、面向对象的编程语言。C语言中的基本数据类型(char、int、float等)都不是对象,因此没有属性、方法可以被调用。OC提供了NSValue、NSNumber来封装C语言的基本类型,这样就可以让它们具有面向对象的特征。
在进行iOS开发时,我们可能会遇到三个类型:
- NSInteger:相当于long
- NSUInteger:相当于unsigned long
- CGFLoat:64位平台相当于double,32位平台相当于float
要注意,这三个类并不是包装类!它们依然只是基本类型。
NSValue和NSNumber
NSValue是更加通用的包装类,它可用于包装单个short、int、long、float、char、指针类型、对象id等数据项;通过该包装类,可以把上述数据项添加到NSarray、NSSet等集合中(这些集合要求它们的元素必须是对象)。
NSNumber则是更加具体的包装类,主要用于包装C语言中的各种数值类型,NSNumber主要包括三类方法(xxx代表某种基本数据类型):
- +numberWithXxx: 该类方法直接将特定类型的值包装成NSNumber
- -initWithXxx: 该实例方法需要先创建一个NSNumber对象,再用一个基本类型的值来初始化NSNumber
- -xxxValue: 该实例方法返回该NSNumber对象包装的基本类型的值
前2类方法的功能基本相同,都是把一个基本数据类型的值包装成包装类的实例,第3类方法则用于从包装类中取出基本类型的值。
#import <Foundation/Foundation.h>
int main() {
@autoreleasepool {
NSNumber *num = [NSNumber numberWithInt:20];
NSNumber *db = [NSNumber numberWithDouble:3.4];
NSLog(@"%d", [num intValue]);
NSLog(@"%g", [db doubleValue]);
NSNumber *ch = [[NSNumber alloc] initWithChar:'J'];
NSLog(@"%@", ch);
}
}
输出:
虽然OC提供了类似于自动装箱的机制,如可将一个整型直接赋给NSNumber变量,但这种机制并不完善,使用自动装箱生成的NSNumber不支持ARC,而且不能将浮点数赋给NSNumber类型的变量。因此通常建议将基本类型的值包装成NSNumber对象。