NSNumber: 是OC中处理数字的一个类

NSValue是NSNumber的子类

如何处理:

把int,float,double  包装成一个对象

使用NSNumber的好处:

可以把基本数据类型的数据,保存到数组或字典中

// 定义基本数据类型
int a = ;
float b = 2.2f;
double d = 1.22; int x = ; // int 包装成 NSNumber
NSNumber *intObj = [NSNumber numberWithInt:a];
NSMutableArray *array = [NSMutableArray arrayWithObjects: intObj, nil]; // float 包装成 NSNumber
NSNumber *floatObj = [NSNumber numberWithFloat:b];
// 把对象添加到数组中
[array addObject:floatObj]; // double 包装成 NSNumber
NSNumber *doubleObj = [NSNumber numberWithDouble:d];
// 把对象添加到数组中
[array addObject:doubleObj]; // @数值,把数值包装成对象,快速简单的方法
[array addObject:@(x)];
NSLog(@"%@",array); // 数组的第一个元素和第二个元素相加
NSNumber *n1 = array[]; // 取出第0位元素
int a1 = [n1 intValue];
NSNumber *n2 = array[]; // 取出第1位元素
float a2 = [n2 floatValue]; //a1 = a1+a2;
// 简洁
a1 = [array[] intValue] +[array[] floatValue];
NSLog(@"%d",a1);

NSValue:主要是用来把指针,CGRect结构体等包装成OC对象,以便储存

    CGPoint p1 = CGPointMake(, );
CGRect r1 = CGRectMake(, , , );
NSMutableArray *arr = [NSMutableArray array];
// p1包装成 obj
NSValue *pointValue = [NSValue valueWithPoint:p1]; // 把对象存到数组中
[arr addObject:pointValue];
// 把r1 包装成 NSValue对象
[arr addObject:[NSValue valueWithRect:r1]];
NSLog(@"%@",arr); // 取出r1 的值
NSValue *r1Value = [arr lastObject];
NSRect r2 = [r1Value rectValue]; NSLog(@"%@", NSStringFromRect(r2));

包装struct

// 定义日期结构体
typedef struct Date
{
int year;
int month;
int day; } MyDate;
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 年—月-日
MyDate nyr = {, , }; // @encode(MyDate)作用,把MyDate类型生成一个常量字符串描述
NSValue *val = [NSValue valueWithBytes:&nyr objCType:@encode(MyDate)]; // 定义一个数组,把val存到数组中
NSMutableArray *arr = [NSMutableArray arrayWithObject:val];
/*
从数组中取出来NSValue对象
从对象中,取出结构体变量的值
传入一个结构体变量的地址
*/
MyDate tmd;
[val getValue:&tmd];
NSLog(@"%d, %d. %d",tmd.year, tmd.month, tmd.day);
04-26 07:23