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