装箱:boxing,指的是将基本数据类型转为oc对象
拆箱:unboxing,指的是将oc对象转为基本数据类型
在这里我们要用到两个类--NSValue和NSNumber
NSValue:适用于结构体类型的变量与oc对象的转换。
NSNumber:适用于除了结构体变量之外的基本数据类型与oc对象之间的转换。
// NSValue
//系统自带的结构体,以CGPoint为例
//创建一个结构体的变量(基本数据类型)
CGPoint point = CGPointMake(100, 100);
//装箱
NSValue *pointValue = [NSValue valueWithPoint:point];
NSLog(@"%@",pointValue);
//拆箱
CGPoint point2 = [pointValue pointValue];
NSLog(@"拆箱:x=%.1f,y=%.1f",point2.x,point2.y);
//自定义的结构体
typedef struct{
NSUInteger year;
NSUInteger month;
NSUInteger day;
} JRDate;
//创建一个对象
JRDate date1 = {2016,1,1};
//获取自定义的结构体类型的字符串 @encode:编码 decode:解码
char *type = @encode(JRDate);
//装箱:参数1:要装箱的结构变量的地址。 参数2:表示类型的字符串
NSValue *dateValue =[NSValue value:&date1 withObjCType:type];
NSLog(@"dateValue:%@",dateValue); //打印出来是二进制的
//拆箱:
//声明一个结构变量,用于存储拆箱之后的结果
JRDate date2;
//取出对应的结构体变量:没有返回值,直接将拆箱的结果存到变量对应的地址中。参数:新声明的变量的地址
[dateValue getValue:&date2];
NSLog(@"date2:%lu年%lu月%lu日",date2.year,date2.month,date2.day);
//NSNumber
//装箱,以int float为例
NSNumber *number1 = [[NSNumber alloc] initWithInt:1];
NSNumber *number2 = [NSNumber numberWithInt:1];
NSNumber *number3 = [NSNumber numberWithFloat:1.0];
//拆箱
int num1 = [number1 intValue];
int num2 = [number2 intValue];
float num3 = [number3 floatValue];
//快速装箱 利用@()
NSNumber *num1_1 = @10;
NSNumber *num1_2 = @(10+2);
float tNum = 10.0;
NSNumber *num1_3 = @(tNum);