• OC系列高级-NSValue


    一.NSValue和NSNumber关系

    NSValue是NSNumber的父类,两者都是对数据类型进行转化成对象以方便操作的。不同点在于:NSNumber是对基本数据类型进行分装,但是对结构体和指针转化不了,这一点NSValue要范围要广,对结构体和指针转为对象,NSValue可以做到。

    二.结构体与对象

    1.首先建一个结构体:

    struct sct{
        int english;
        float math;
    } score = {80,92.5f};
    

    2.结构体转为对象

            //意图?将结构体类型数据包装进nsvalue当中
    //第一个常数:传入结构体的地址,这样才能知道我们要存储的数据在哪里 //第二个常数:将要存储的数据类型转化为c语言的字符串 NSValue *value = [[NSValue alloc]initWithBytes:&score objCType:@encode(struct sct)]; NSLog(@"%s",@encode(struct sct)); //这是把结构体的数据类型进行转化为c语言的字符串

      输出结果:

    2016-06-29 20:17:55.527 NSValue[555:85711] {sct=if}  //结构体的数据类型转为c语言的字符串,i为int类型,f为float类型
    Program ended with exit code: 0

    2.做对象才能做的操作:比如将对象存入字典

            NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:value,@"key", nil];
            NSValue *value1 = [dic objectForKey:@"key"];
            NSLog(@"%@",value1);
    

    value1答应结果为:

    2016-06-29 20:26:05.652 NSValue[579:112040] <50000000 0000b942>  //对象的地址
    Program ended with exit code: 0
    

    3.NSValue还原成结构体

    3.1声明一个空的结构体变量

    struct sct score2;

    3.2value1里包装的结构体存进3.1步骤的空的结构体变量中

            //&:表示将value1取出的数据存放到哪里
            [value1 getValue:&score2];
    NSLog(@"english = %d,math = %f",score2.english,score2.math);

      输出结果:

    2016-06-29 20:38:57.380 NSValue[603:155723] english = 80,math = 92.500000
    Program ended with exit code: 0
    

    三.指针与对象

    1.首先创建一个指针

    char *p = (char *)0x1f;  //对十六进制的数进行强制转换
    

    2.指针转为对象

            NSValue *value3 = [[NSValue alloc]initWithBytes:&p objCType:@encode(char *)];
            NSLog(@"%@",value3);
    

      输出结果:

    2016-06-29 20:51:16.940 NSValue[624:197140] <1f000000 00000000>
    

    3.对象转指针

    3.1.声明一个空的指针

    char *q;
    

    3.2.对象转指针

            [value3 getValue:&q];
            NSLog(@"%c",q);
    

       输出结果:

    2016-06-30 11:41:42.237 NSValue[525:31317]   //输出结果为空的,因为是一个空的指针
    Program ended with exit code: 0
    

    四.NSRange,CGPoint,CGSizeNSValue

     它们都是结构体,是由苹果已经封装好的结构体

    4.1转对象

            NSRange range = NSMakeRange(2, 3);
            NSValue *value = [NSValue valueWithRange:range];
            
    //        [NSValue valueWithPoint:point];
    //        [NSValue valueWithSize:size];
    //        [NSValue valueWithRect:rect];
    

    4.2对象还原

            NSRange range1;
            [value5 getValue:&range1];
            NSLog(@"%d,%d",range1.location,range1.length);
    

       输出结果:

    2016-06-30 11:54:18.099 NSValue[548:69907] 2,3
    Program ended with exit code: 0
    

    五.总结

    1.NSValue是NSNumber的父类,它不只可以把int,float,char等这些基本的数据类型的数据转为对象,也可以把结构体以及指针转为对象

    2.苹果已经封装好的结构体直接用valuewith就可以转为对象,自定义的结构和指针用initWithBytes将结构体转为对象,对象还原都是通过getValue来转化

      

    未来的你会感谢今天努力的自己 ------Alen
  • 相关阅读:
    MultipartFile(文件的上传)
    JSONObject.fromObject--JSON与对象的转换
    Map集合与转化
    java读取excel文件
    Java中的Arrays类使用详解
    Arrays 类的 binarySearch() 数组查询方法详解
    JDK8 特性详解
    关于Java堆、栈和常量池的详解
    深入java final关键字
    杯酒人生
  • 原文地址:https://www.cnblogs.com/kaihuacheng/p/5628212.html
Copyright © 2020-2023  润新知