经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
ios学习路线—Objective-C(装箱和拆箱)
来源:cnblogs  作者:久依  时间:2018/12/17 9:38:19  对本文有异议

概述 
从前面的博文我们也可以看到,数组和字典中只能存储对象类型,其他基本类型和结构体是没有办法放到数组和字典中的,当然你也是无法给它们发送消息的也就是说有些NSObject的方法是无法调用的,这个时候通常会用到装箱boxing和拆箱unboxing。

其实各种高级语言基本上都有装箱和拆 箱的过程,例如C#中我们将基本数据类型转化为Object就是一个装箱的过程,将这个Object对象转换为基 本数据类型的过程就是拆箱,而且在C#中装箱的过程可以自动完成,基本数据类型可以直接赋值给Object 对象。但是在ObjC中装箱的过程必须手动实现,ObjC不支持自动装箱。

对象的装箱和拆箱,在ObjC中我们一般将基本数据类型装箱成 NSNumber 类型当然它也是 NSObject 的子类,但是 NSNumber 不能对结构体装箱,调用其对应的方法进行转换:

  1. +(NSNumber *)numberWithChar:(char)value;
  2. +(NSNumber *)numberWithInt:(int)value;
  3. +(NSNumber *)numberWithFloat:(float)value;
  4. +(NSNumber *)numberWithDouble:(double)value;
  5. +(NSNumber *)numberWithBool:(BOOL)value;
  6. +(NSNumber *)numberWithInteger:(NSInteger)value;

拆箱的过程就更加简单了,可以调用如下方法:

  1. -(char)charValue;
  2. -(int)intValue;
  3. -(float)floatValue;
  4. -(double)doubleValue;
  5. -(BOOL)boolValue;

示例

  1. #import <Foundation/Foundation.h>
  2.  
  3. /*可以存放基本类型到数组、字典*/
  4. void test1() {
  5. //包装类NSNumber,可以包装基本类型但是无法包装结构体类型
  6. NSNumber *number1 = [NSNumber numberWithChar:'a'];//'a'是一个C语言的char类型我们无 法放倒NSArray中,但是我们可以通过NSNumber包装
  7. NSArray *array1 = [NSArray arrayWithObject:number1];
  8. NSLog(@"%@", array1);
  9. /*结果:
  10. (
  11. 97
  12. ) */
  13. NSNumber *number2 = [array1 lastObject];
  14. NSLog(@"%@", number2);//返回的不是基本类型,结果:97
  15. char char1 = [number2 charValue];//number转化为char
  16. NSLog(@"%c", char1); //结果:a
  17. }
  18. int main(int argc, const char *argv[]) {
  19. @autoreleasepool {
  20. test1();
  21. }
  22. return 0;
  23. }

 

结构体的装箱和拆箱 
上面我们看到了基本数据类型的装箱和拆箱过程,那么结构体呢? 
这个时候我们需要引入另外一个类型NSValue,其实上面的NSNumber就是NSValue的子类,它包装了一些基本数据类型的常用装箱、拆箱方法,当要对结构体进行装箱、拆箱操作我们需要使用NSValue,NSValue可以对任何数据类型进行装箱、拆箱操作。

事实上对于常用的结构体Foundation已经为我们提供好了具体的装箱方法:

  1. +(NSValue *)valueWithPoint:(NSPoint)point;
  2. +(NSValue *)valueWithSize:(NSSize)size;
  3. +(NSValue *)valueWithRect:(NSRect)rect;

对应的拆箱方法:

  1. -(NSPoint)pointValue;
  2. -(NSSize)sizeValue;
  3. -(NSRect)rectValue;

示例

  1. #import <Foundation/Foundation.h>
  2.  
  3. //NSNumber是NSValue的子类,而NSValue可以包装任何类型,包括结构体
  4. void test1() {
  5. CGPoint point1 = CGPointMake(10, 20);
  6. NSValue *value1 = [NSValue valueWithPoint:point1];//对于系统自带类型一般都有直接的方 法进行包装
  7. NSArray *array1 = [NSArray arrayWithObject:value1];//放倒数组中
  8. NSLog(@"%@",array1);
  9. /*结果:
  10. (
  11. "NSPoint: {10, 20}"
  12. ) */
  13. NSValue *value2 = [array1 lastObject];
  14. CGPoint point2 = [value2 pointValue];//同样对于系统自带的结构体有对应的取值方法(例如 本例pointValue)
  15. NSLog(@"x=%f,y=%f", point2.x, point2.y);//结果:x=10.000000,y=20.000000
  16. }
  17. int main(int argc, const char *argv[]) {
  18. @autoreleasepool {
  19. test1();
  20. }
  21. return 0;
  22. }

 

自定义的结构体类型的装箱和拆箱  如果是我们自定义的结构体类型呢,这个时候我们需要使用NSValue如下方法进行装箱:

  1. +(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;

调用下面的方法进行拆箱:

  1. -(void)getValue:(void *)value;

示例

  1. #import <Foundation/Foundation.h>
  2. typedef struct {
  3. int year;
  4. int month;
  5. int day;
  6. } Date;
  7. //NSNumber是NSValue的子类,而NSValue可以包装任何类型,包括结构体
  8. void test1() {
  9. //如果我们自己定义的结构体包装
  10. Date date = {2014, 2, 28};
  11. char *type = @encode(Date);
  12. NSValue *value3 = [NSValue value:&date withObjCType:type];//第一参数传递结构体地址,第二个参数传递类型字符串
  13. NSArray *array2 = [NSArray arrayWithObject:value3];
  14. NSLog(@"%@", array2);
  15. /*结果:
  16. (
  17. "<de070000 02000000 1c000000>"
  18. ) */
  19. Date date2;
  20. [value3 getValue:&date2];//取出对应的结构体,注意没有返回值
  21. //[value3 objCType]//取出包装内容的类型 NSLog(@"%i,%i,%i",date2.year,date2.month,date2.day); //结果:2014,2,28
  22. }
  23. int main(int argc, const char *argv[]) {
  24. @autoreleasepool {
  25. test1();
  26. }
  27. return 0;
  28. }
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号