A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© u37kl 中级黑马   /  2016-2-19 18:49  /  880 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

#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中。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马