搜索
您的当前位置:首页正文

OC语言day08-12NSValue

来源:二三娱乐

pragma mark NSValue

pragma mark 概念

/**
 NSValue 其实是 NSNumber的子类
 
 - NSNumber 只能包装 数字类型
 * NSValue  可以包装 任意值
 
 1.为什么要使用 NSValue
 比如存储的是一个结构体 是放不进去到 NSNumber 里面的
 
 2.使用 NSValue 包装系统的结构体 (valueWithPoint:)
 ....
 
 3.使用 NSValue 包装 自定义的 结构体 (valueWithBytes : objCType)
 参数说明
 valueWithBytes : 接受一个指针,需要传递需要 包装的 结构体的变量 的地址 (&p)
 objCType : 需要传递 需要包装的数据类型 @encode(Person)

 格式
 NSValue *valueP = [NSValue valueWithBytes:结构体的指针地址 objCType:@encode(结构体的名字)];
 NSArray *arr1 = @[valueP];
 
 4.从 NSValue 取出 自定义的 结构体变量 (getValue:) 需要传递指针的地址
 参数说明
getValue:结构体的指针地址
 
 */

pragma mark 代码

#import <Foundation/Foundation.h>
#pragma mark 类

#pragma mark main函数
int main(int argc, const char * argv[])
{
#pragma NSValue
#warning 1.比如存储的是一个结构体 是放不进去到 NSNumber 里面的
    
    // 定义一个结构体
    typedef struct {
        int age;
        char *name;
        double height;
        
    }Person;
    
    // 结构体 不能通过 NSNumber 转换成对象
    Person p = {24,"lyh",1.72};
//    NSArray *arr = @[p];
    
#warning 2.使用 NSValue 包装系统的结构体
    CGPoint point = NSMakePoint(10, 20);
    NSValue *value = [NSValue valueWithPoint:point];
    NSArray *arr = @[value];
    NSLog(@"arr = %@",arr);
    
#warning 3.使用 NSValue 包装 自定义的 结构体 (valueWithBytes : objCType)
    /**
     valueWithBytes : 接受一个指针,需要传递需要 包装的 结构体的变量 的地址 (&p)
     objCType : 需要传递 需要包装的数据类型 @encode(Person)
     */
    NSValue *valueP = [NSValue valueWithBytes:&p objCType:@encode(Person)];
    NSArray *arr1 = @[valueP];
    NSLog(@"arr1 = %@",arr1);   //     "<18000000 00000000 4a0f0000 01000000 85eb51b8 1e85fb3f>"

#warning 4.从 NSValue 取出 自定义的 结构体变量 (getValue:) 需要传递指针的地址
    /**
     
     */
    Person p1;
    [valueP getValue:&p1];
    NSLog(@"age = %i, name = %s ,height = %f",p1.age,p1.name,p1.height);
    

    return 0;
}

Top