IOS开发入门之Objective-C(装箱和拆箱)
白羽 2018-12-27 来源 :网络 阅读 810 评论 0

摘要:本文将带你了解IOS开发入门之Objective-C(装箱和拆箱),希望本文对大家学IOS有所帮助。

    本文将带你了解IOS开发入门之Objective-C(装箱和拆箱),希望本文对大家学IOS有所帮助。


概述 从前面的博文我们也可以看到,数组和字典中只能存储对象类型,其他基本类型和结构体是没有办法放到数组和字典中的,当然你也是无法给它们发送消息的也就是说有些NSObject的方法是无法调用的,这个时候通常会用到装箱boxing和拆箱unboxing。
    其实各种高级语言基本上都有装箱和拆 箱的过程,例如C#中我们将基本数据类型转化为Object就是一个装箱的过程,将这个Object对象转换为基   本数据类型的过程就是拆箱,而且在C#中装箱的过程可以自动完成,基本数据类型可以直接赋值给Object   对象。但是在ObjC中装箱的过程必须手动实现,ObjC不支持自动装箱。
    对象的装箱和拆箱,在ObjC中我们一般将基本数据类型装箱成 NSNumber 类型当然它也是 NSObject 的子类,但是 NSNumber   不能对结构体装箱,调用其对应的方法进行转换:
   
    +(NSNumber *)numberWithChar:(char)value;
    +(NSNumber *)numberWithInt:(int)value;
    +(NSNumber *)numberWithFloat:(float)value;
    +(NSNumber *)numberWithDouble:(double)value;
    +(NSNumber *)numberWithBool:(BOOL)value;
    +(NSNumber *)numberWithInteger:(NSInteger)value;
   
    拆箱的过程就更加简单了,可以调用如下方法:
   
    -(char)charValue;
    -(int)intValue;
    -(float)floatValue;
    -(double)doubleValue;
    -(BOOL)boolValue;
   
    示例
   
    #import <Foundation/Foundation.h>
   
    /*可以存放基本类型到数组、字典*/
    void test1() {
          //包装类NSNumber,可以包装基本类型但是无法包装结构体类型
        NSNumber *number1 = [NSNumber   numberWithChar:'a'];//'a'是一个C语言的char类型我们无   法放倒NSArray中,但是我们可以通过NSNumber包装
        NSArray *array1 = [NSArray   arrayWithObject:number1];
        NSLog(@"%@",   array1);
        /*结果:
        (
        97
        ) */
        NSNumber *number2 = [array1   lastObject];
        NSLog(@"%@",   number2);//返回的不是基本类型,结果:97
        char char1 = [number2   charValue];//number转化为char
        NSLog(@"%c", char1);   //结果:a
    }
   
    int main(int argc, const char *argv[]) {
        @autoreleasepool {
            test1();
        }
        return 0;
    }
   
     
      结构体的装箱和拆箱 上面我们看到了基本数据类型的装箱和拆箱过程,那么结构体呢? 这个时候我们需要引入另外一个类型NSValue,其实上面的NSNumber就是NSValue的子类,它包装了一些基本数据类型的常用装箱、拆箱方法,当要对结构体进行装箱、拆箱操作我们需要使用NSValue,NSValue可以对任何数据类型进行装箱、拆箱操作。
    事实上对于常用的结构体Foundation已经为我们提供好了具体的装箱方法:
   
    +(NSValue *)valueWithPoint:(NSPoint)point;
    +(NSValue *)valueWithSize:(NSSize)size;
    +(NSValue *)valueWithRect:(NSRect)rect;
   
    对应的拆箱方法:
   
    -(NSPoint)pointValue;
    -(NSSize)sizeValue;
    -(NSRect)rectValue;
   
    示例
   
    #import <Foundation/Foundation.h>
   
    //NSNumber是NSValue的子类,而NSValue可以包装任何类型,包括结构体
    void test1() {
        CGPoint point1 = CGPointMake(10,   20);
        NSValue *value1 = [NSValue   valueWithPoint:point1];//对于系统自带类型一般都有直接的方 法进行包装
        NSArray *array1 = [NSArray   arrayWithObject:value1];//放倒数组中
          NSLog(@"%@",array1);
        /*结果:
        (
        "NSPoint: {10,   20}"
        ) */
        NSValue *value2 = [array1 lastObject];
        CGPoint point2 = [value2   pointValue];//同样对于系统自带的结构体有对应的取值方法(例如 本例pointValue)
        NSLog(@"x=%f,y=%f",   point2.x, point2.y);//结果:x=10.000000,y=20.000000
    }
   
    int main(int argc, const char *argv[]) {
        @autoreleasepool {
            test1();
        }
        return 0;
    }
   
     
    自定义的结构体类型的装箱和拆箱  如果是我们自定义的结构体类型呢,这个时候我们需要使用NSValue如下方法进行装箱:
   
    +(NSValue *)valueWithBytes:(const void *)value objCType:(const char   *)type;
   
    调用下面的方法进行拆箱:
   
    -(void)getValue:(void *)value;
   
    示例
   
    #import <Foundation/Foundation.h>
   
    typedef struct {
        int year;
        int month;
        int day;
    } Date;
   
    //NSNumber是NSValue的子类,而NSValue可以包装任何类型,包括结构体
    void test1() {
        //如果我们自己定义的结构体包装
        Date date = {2014, 2, 28};
        char *type = @encode(Date);
        NSValue *value3 = [NSValue value:&date   withObjCType:type];//第一参数传递结构体地址,第二个参数传递类型字符串
        NSArray *array2 = [NSArray   arrayWithObject:value3];
        NSLog(@"%@",   array2);
        /*结果:
        (
        "<de070000 02000000   1c000000>"
        ) */
        Date date2;
        [value3   getValue:&date2];//取出对应的结构体,注意没有返回值
        //[value3 objCType]//取出包装内容的类型   NSLog(@"%i,%i,%i",date2.year,date2.month,date2.day);   //结果:2014,2,28
    }
   
    int main(int argc, const char *argv[]) {
        @autoreleasepool {
            test1();
        }
        return 0;
    }    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程