Foundation_05_装箱和开箱——NSNumber_NSValue
一、开箱装箱定义
基本数据类型数组——>对象 装箱(boxing)
对象——>基本数据类型数组 开箱(unboxing)
二、NSNumber装箱
+(NSNumber *)numberWithBool:(BOOL)value
+(NSNumber *)numberWithChar:(char)value
+(NSNumber *)numberWithDouble:(double)value
+(NSNumber *)numberWithFloat:(float)value
+(NSNumber *)numberWithInt:(int)value
+(NSNumber *)numberWithInteger:(NSInteger)value
+(NSNumber *)numberWithLong:(long)value
+(NSNumber *)numberWithLongLong:(long long)value
+(NSNumber *)numberWithShort:(short)value
+(NSNumber *)numberWithUnsignedChar:(unsigned char)value
+(NSNumber *)numberWithUnsignedInt:(unsigned int)value
+(NSNumber *)numberWithUnsignedInteger:(NSUInteger)value
+(NSNumber *)numberWithUnsignedLong:(unsigned long)value
+(NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value
+(NSNumber *)numberWithUnsignedShort:(unsigned short)value
或者如下操作
NSNumber *number;
number = @'X';//字符
number = @123;//整型
number = @123ul;//无符号长整型
number = @123ll;//long long
....
三、NSNumber开箱
-(char)charValue
- (int) intValue
- (float)intValue
- (BOOL)boolValue
- (NSString*)stringValue
3.1 代码示例
void test(){
//方式一
//装箱
NSNumber *number = [NSNumber numberWithInt:23];
//装箱
NSLog(@"%d",[number intValue]);
//方式二
//装箱
NSNumber *number2 = @'x';
//开箱
NSLog(@"%c",[number2 charValue]);
}
3.2 结果
2015-08-16 19:31:17.487 08_Foundation04_开箱和装箱[1115:65797] 23
2015-08-16 19:31:17.489 08_Foundation04_开箱和装箱[1115:65797] x
四、NSValue
NSNumber实际上是NSValue的子类,NSValue可以封任何值。
+(NSValue*)valueWithBytes:(const void *) objCType:(const char *) type
传递的参数就是要封装数值的地址(&),描述这个数据类型的字符串可是使用@encode编译器指令来接收数据类型的名称并生成合适的字符串。
4.1 代码示例
typedef struct {
int nid;
char *fistName;
}Xm;
void test2(){
Xm xm = {12,"woshixiaoming"};
NSValue *value = [NSValue value:&xm withObjCType:@encode(Xm)];
Xm xm2;
[value getValue:&xm2];
NSLog(@"%d",xm2.nid);
NSLog(@"%s",xm2.fistName);
}
4.2 结果
2015-08-16 20:14:07.059 08_Foundation04_开箱和装箱[1366:74106] 12
2015-08-16 20:14:07.064 08_Foundation04_开箱和装箱[1366:74106] woshixiaoming
4.3 其他便捷的方法
+(NSValue*)valueWithPoint:(NSPoint)apoint;
+(NSValue*)valueWithSize:(NSSize)size;
+(NSValue*)valueWithRect:(NSRect)rect;
-(NSPoint)pointValue;
-(NSSize)sizeValue;
-(NSRect)rectValue;
五、NSNull
+(NSNull*)null;
[NSNull null]总是返回一样的数值,所以可以使用运算符 == 将该值与其他值进行比较。
5.1 代码示例
void test3(){
NSNull *nsNull = [NSNull null];
NSLog(@"%@",nsNull);
}
5.2 结果
2015-08-16 20:29:00.423 08_Foundation04_开箱和装箱[1406:76512] <null>