zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Win7 SP1 安装SQL Server 2012时提示“此计算机上的操作系统不符合 SQL Server 2012的最低要求”
    ajax jsonp跨域
    Caused by: Unable to locate parent package [json-package] for [class com.you.action.ColumnAction]
    PHP MVC自己主动RBAC自己主动生成的访问路由
    Service与Activity与交流AIDL
    SVN常见错误两项纪录
    EL表达式语言
    oracle11g ASM(修复损坏的磁盘组头asm修复2)
    如何使用iOS 8 指纹识别,代码、示例
    EXCEL Pivot table manipulate
  • 原文地址:https://www.cnblogs.com/kaihuacheng/p/5628212.html
Copyright © 2011-2022 走看看