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;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容