Foundation 之 NSValue

来源:互联网 发布:淘宝清仓的报名流程 编辑:程序博客网 时间:2024/06/05 15:21

NSValue


      NSValue是NSNumber的父类,可以将指针、结构体等复杂的数据类型存储为对象。
      NSValue同NSNumber一样,也是一个类簇,它可以生成各种数据类型的对象。

把结构体数据存储为对象

        struct sct{
                int a;
                int b;
        }sct1 = {4, 5};

        NSValue * value = [[NSValue alloc] initWithBytes:&sct1 objCType:@encode(struct sct)];
                // 第一个参数&sct1是要存储数据的地址,
                // 第二个参数@encode(struct sct)是将要存储的数据类型转换成一个字符串标识
                        // 如 NSLog(@"%s", @encode(int));  能打印出int型转换成的字符串标识

判断NSValue是何种数据类型的对象

      用NSValue对象的objCType方法查看它的数据类型字符串标识。如:
        if(strcmp(value.objCType, @encode(struct sct)) == 0){
                NSLog(@"It is struct sct.");
        }

从结构体对象中把数据取出来

        struct sct newSct1;
        [value getValue: &newSct1]; // 参数传入的是要存储取出来的数据的地址
                // 从value对象中取出结构体数据到newSct1
        NSLog(@"%d %d", newSct1.a, newSct1.b);

把指针存储为对象

        char * p = 0x1f;
        NSValue * value = [[NSValue alloc] initWithBytes:&p objCType:@encode(char *)];

从指针对象中把指针取出来

        char * newP;
        [value getValue: &newP];  // 传入地址
        NSLog(@"%p", newP);

根据存储的数据的不同,生成的对象是不同类的对象

        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 0