------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
NSValue的介绍和使用
1、NSValue的介绍和使用
NSValue包装对象指针,CGRect结构体等
一个NSValue对象是用来存储一个C或者Objective-C数据的简单容器。它可以保存任意类型的数据,比如int,float,char,当然也可以是指pointers, structures, and object is。
NSValue 类的目标就是允许以上数据类型的数据结构能够被添加到集合里,
例如那些需要其元素是对象的 数据结构,如NSArray或者NSSet的实例。
需要注意的是NSValue对象一直是不可枚举的。
为了方便结构体和NSValue 的转换,Foundation提供了以下方法
将结构体包装成NSValue对象-------> 存储结构体到集合中
+ (NSValue *)valueWithPoint:(NSPoint)point;
+ (NSValue *)valueWithSize:(NSSize)size;
+ (NSValue *)valueWithRect:(NSRect)rect;
从NSValue对象取出之前包装的结构体
- (NSPoint)pointValue;
- (NSSize)sizeValue;
- (NSRect)rectValue;
不能直接放NSPoint类型的数据在数组中
+ (NSValue *)valueWithBytes:(constvoid *)value objCType:(const char*)type;
创建一个NSValue
value:对象地址
objCType:通常是一个用来描述对象类型和大小的字符串,
@encode可以接受一个数据类型 的名称自动生成一个合适的描述字符串
- (void)getValue:(void *)value(出参);
从接受value的对象中
提取数值;
提取的数值,存放在这个指针所指向的内存块里
typedef struct {
int year;
int month;
int day;
} Date;
Date d = {2015,2, 1};
//将结构体d包装成NSValue对象
NSValue *dValue = [NSValuevalueWithBytes:&d objCType:@encode(Date)];
NSArray *array = @[dValue];
//取出value之前包装的结构体数据
Date newD;
[dValue getValue:&newD];
<span style="font-size:14px;">#import <Foundation/Foundation.h>
void test(){
//创建一个结构体变量,保存点
// p1 是 CGPoint 类型的结构体变量
CGPoint p1 = CGPointMake(20, 50);
NSRect r1 = NSMakeRect(0, 0, 200, 100);
//创建数组
NSMutableArray *arr = [NSMutableArray array];
//p1 ---> obj
//valueWithPoint 把结构体转换为NSValue对象
NSValue *pointVal = [NSValue valueWithPoint:p1];
//把对象存放到数组中
[arr addObject:pointVal];
[arr addObject:[NSValue valueWithRect:r1]];
NSLog(@"arr = %@",arr);
//取出r1的值
// rectValue 从NSValue对象中,取得NSRect类型的值
NSValue *r1Val = [arr lastObject];
NSRect r2 = [r1Val rectValue];
NSLog(@"%@",NSStringFromRect(r2));
}
typedef struct D{
int year;
int month;
int day;
} MyDate; //MyDate是一个别名
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 保存 一个 年月日
// 2015-5-7
MyDate md = {2015,5,7};
// md -----> obj
//@encode(MyDate) 作用,把MyDate类型生成一个常量字符串描述
NSValue *val = [NSValue valueWithBytes:&md objCType:@encode(MyDate)];
//定义一个数组,把val存到数组中
NSMutableArray *arr = [NSMutableArray arrayWithObject:val];
//从数组中取出来NSValue对象
//从对象中,取出结构体变量的值
// 传入一个结构体变量的地址
MyDate tmd;
// getValue获取结构值,保存到结构体变量tmd
[val getValue:&tmd];
NSLog(@"%d,%d,%d",tmd.year,tmd.month,tmd.day);
}
return 0;
}</span>