#NSNumber
1、NSNumber类存在的目的是为了将基本数据类型包转成OC对象,这样可以保存到NSArray和NSDictionary中。
2、以前的方式:基本类型 --> NSNumber
1> NSNumber *num = [NSNumber numberWithInt:12]; // +(NSNumber)numberWithInt:(int);
2> NSNumber *num = [NSNumber numberWithFloat:12.5f]; // +(NSNumber)numberWithFloat:(float);
3> NSNumber *num = [NSNumber numberWithDouble:11.5]; // +(NSNumber)numberWithDouble:(double);
4> NSNumber *num = [NSNumber numberWithBool:YES]; // +(NSNumber)numberWithBool:(BOOL);
5> NSNumber *num = [NSNumber numberWithChar:'a']; // +(NSNumber)numberWithChar:(Char);
2、现在的方式:基本类型 --> NSNumber
1>@12;
2>@12.2;
3>@12.5f;
4>@Yes;
5>@(基本数据类型变量) -- 即int a = 12; NSNumber *n = @(a);
3、NSNumber --> 基本类型
1> int a = [num intValue]; // -(int)intValue;
2> float a = [num floatValue]; // -(float)floatValue;
3> double a = [num doubleValue]; // -(double)doubleValue;
4> BOOL a = [num boolValue]; // -(BOOL)boolValue;
5> char a = [num charValue]; // -(char)charValue;
4、注意:
1>NSNumber对象不能直接运算,必须转换成基本数据类型才能相加。NSNumber *n1 = @1; NSNumber *n2 = @2; NSNumber *n3 = n1+n2; // 这样写是错误的,指针不能相加减。
2>NSLog函数打印表达式结果时,运算符两侧的数据类型要一致,否则打印结果不准确。
int a = 1;
float b = 2.2;
NSLog(@"%d", a+b); // 如果使用NSLog函数打印一个不同基本类型运算表达式,则打印结果不正确;
NSLog(@"%d", a+ (float)b); // 必须讲表达式中所有的数据类型统一才行,这样打印结果才会正确。
#NSValue
1、NSValue类是NSNumber的父类,用了将结构体、枚举、指针保存到OC集合中。
2、将OC常用的结构体 --> NSValue
1> NSValue *v = [NSValue valueWithPoint:p]; // +(NSValue) valueWithPoint:(NSPoint);
2> NSValue *v = [NSValue valueWithSize:s]; // +(NSValue) valueWithSize:(NSSize);
3> NSValue *v = [NSValue valueWithRect:rect]; // +(NSValue) valueWithRect:(NSRect);
3、NSValue --> OC常用的结构体
1> CGPoint p = [v pointValue]; // - (NSPoint)PointValue;
2> CGSize s = [v sizeValue]; // - (NSSize)SizeValue;
3> CGRect rect = [v rectValue]; // - (NSRect)rectValue;
4、将基本数据类型 --> NSValue
1> +(NSValue)valueWithBytes:(const void *) objCType:(const char *); @encode(数据类型),将数据类型转换成常量字符串,让NSValue知道保存的是哪种基本类型数据。
char c = 'A';
NSValue *v = [NSValue valueWithBytes:&c objCType:@encode(char)];
struct birthday day = {2015, 12, 10};
NSValue *v = [NSValue valueWithBytes:&day objCType @encode(struct birthday)];
// 将结构体中的数据以二进制形式保存,即读取时会以内存中的样子显示,因为程序不知到该数据的真正数据类型,所以没有办法转化成相应的数据类型显示,所以只能打印出内存中的二机制数。
int a = 1;
[NSValue valueWithBytes:&a objCType @encode(int)];
5、将一个NSValue --> 基本数据类型
1> -(void) getValue:(Void *)value;
struct birthday day1;
[v getValue:&day1]; // 将NSValue中的二机制数据保存到结构体变量day1中。 |
|