OC基础-NSValue类簇-将复杂数据类型保存为对象

一、NSValue概述

NSValue类是NSNumber类的父类,也是一个类簇,NSNumber类用于对简单数据类型进行装箱,变成对象;NSValue类用于对复杂数据类型(指针、结构体)进行装箱,变成对象。


二、NSValue的使用

1.创建对象--装箱

将结构体封装成对象,以对象的形式展现

#import <Foundation/Foundation.h>

struct Student{
    int age;
    float score;
    char * name;
} s1={12, 82.5f, "Andy"};

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //NSValue是NSNumber的父类,也是一个类簇。用来把指针、结构体等复杂数据类型存储为对象。
        
        NSValue * value = [[NSValue alloc] initWithBytes: &s1 objCType: @encode(struct Student)];
        /*参数1:地址
         参数2:类型唯一标志,是一个字符串
         */
        
        NSLog(@"%s", @encode(int)); //i
        NSLog(@"%s", @encode(struct Student));//{Student=if*}, i-int, f-float, *-string
    }
    return 0;
}

理解@encode的作用:它以简写的字符串形式来表示一个类型。

i-->int

f-->float

*-->string

2.判断一个value是否属于某个对象类型

 if( strcmp(value.objCType, @encode(struct Student)) == 0){
            NSLog(@"This value' type is struct Student.");
        }
    }

3.获得NSValue中的数据-拆箱

struct Student s2;
        [value getValue: &s2];
        
        NSLog(@"%@", value);
        NSLog(@"age=%d, score=%f, name=%s", s2.age, s2.score, s2.name);

4.对指针数据类型进行装箱和拆箱

上面已经演示了如何对结构体数据类型进行装箱和拆箱,这里演示的是如何对指针数据类型进行装箱和拆箱。

 //装箱
        char * p = (char *) 0x1f;
        NSValue * value = [[NSValue alloc] initWithBytes: &p objCType:@encode(char *)];
        
        //拆箱
        char * p2;
        [value getValue: &p2];
        NSLog(@"%p", p2);

5.OC中常用结构体装箱

  //OC中有几个常用的结构体
        CGPoint point;
        CGSize size;
        CGRect rect;
        
        NSValue * pointValue = [NSValue valueWithPoint:point];
        NSValue * sizeValue = [NSValue valueWithSize:size];
        NSValue * rectValue = [NSValue valueWithRect:rect];
        NSValue * rangeValue = [NSValue valueWithRange:NSMakeRange(3, 4)];


@诗未冷学习博客


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值