【黑马程序员】NSvalue的用法

       ---------- IOS培训java培训、期待与您交流! ----------

        


        NSNumber NSValue的子类,但NSNumber只能包装数字类型,NSValue可以包装任意值

        也就可以用NSValue包装结构体后加入NSArray NSDictionary等集合中

        

        

        创建NSValue的常用方法

        -(id)initWithBytes:(const void *)value objCType:(const char *)type

        +(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type

        +(NSValue *)value:(const void *)value objCType:(const char *)type

        

        value 参数是想要包装的数据的地址(如一个NSPoint)的地址,可以用&来取地址),

        type参数是用来描述这个数据类型的字符串,用@encode()指令来生成;

        

        -(void)getValue:(void *)value

        获取所包装的数据,保存到value这个地址

        -(const char*)objCType

        返回描述所包装数据类型的字符串

        -(BOOL)isEqualToValue:(NSValue *)value

        

        

        为了方便structNSValue的转换,cocoa还提供了以下方法:

        +(NSValue *)valueWithPoint:(NSPoint)point

        +(NSValue *)valueWithSize:(NSSize)size

        +(NSValue *)valueWithRect:(NSRect)rect

        

        -(NSPoint)pointValue

        -(NSSize)sizeValue

        -(NSRect)rectValue

        

        

        实例、具体运用如下:



    CGPoint point = CGPointMake(10, 10);

    // 将结构体变量包装成一个对象

    NSValue *value = [NSValue valueWithPoint:point];

    

    NSMutableArray *array = [NSMutableArray array];

    // 添加value

    [array addObject:value];

    

    // 取出当时放进去的value

    NSValue *value1 = [array lastObject];

    CGPoint point1 = [value1 pointValue];

    

    BOOL result = CGPointEqualToPoint(point1, point);

    NSLog(@"result=%i", result);



如下我们把一个结构体类型通过NSvalue包装成一个对象。然后将之解包。

typedef struct {
    int year;
    int month;
    int day;
} Date;
void value2() {
    Date date = {2015, 2, 15};
    // void *代表任何指针
    // 这里要传结构体的地址&date
    
    // 根据结构体类型生成 对应的 类型描述字符串
    char *type = @encode(Date);
    NSValue *value = [NSValue value:&date withObjCType:type];
    
    
    // 定义一个结构体变量
    Date date1;
    
    // 取出包装好的结构体
    [value getValue:&date1];
    
    // [value objCType];  取出类型描述字符串
    
    NSLog(@"year=%i, month=%i, day=%i", date1.year, date1.month, date1.day);
}

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        value2();
    }
    return 0;
}
运行结果如下:

2015-02-15 17:31:39.671 Foundation12-NSValue[1347:225487] year=2015, month=2, day=15

Program ended with exit code: 0



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值