NSNumber实际上是NSValue的子类,NSValue可以封装任意值,使用NSValue可以将结构体放在NSArray或 NSDictionary中,
@interface NSValue (NSValueUIGeometryExtensions) + (NSValue *)valueWithPointer:(const void *)pointer;//保存对象指针 + (NSValue *)valueWithCGPoint:(CGPoint)point;//保存CGPoint结构体 + (NSValue *)valueWithCGSize:(CGSize)size;//保存CGSize结构体 + (NSValue *)valueWithCGRect:(CGRect)rect;//保存CGRect结构体 + (NSValue *)valueWithCGAffineTransform:(CGAffineTransform)transform; + (NSValue *)valueWithUIEdgeInsets:(UIEdgeInsets)insets; - (void *)pointerValue; - (CGPoint)CGPointValue; - (CGSize)CGSizeValue; - (CGRect)CGRectValue; - (CGAffineTransform)CGAffineTransformValue; - (UIEdgeInsets)UIEdgeInsetsValue; @end
2.使用介绍
1.自定义的字符
char *p = (char *)0x1f; NSValue * value = [[NSValue alloc] initWithBytes:&p objCType:@encode(char *)]; char *q; [value getValue:&q]; NSLog(@"%p", q);
2.自定义结构体
#import <Foundation/Foundation.h> typedef struct { int year; int month; int day; } Date; //NSNumber是NSValue的子类,而NSValue可以包装任何类型,包括结构体 void test1(){ //如果我们自己定义的结构体包装 Date date={2014,2,28}; char *type=@encode(Date); NSValue *value3=[NSValue value:&date withObjCType:type];//第一参数传递结构体地址,第二个参数传递类型字符串 NSArray *array2=[NSArray arrayWithObject:value3]; NSLog(@"%@",array2); /*结果: ( "<de070000 02000000 1c000000>" ) */ Date date2; [value3 getValue:&date2];//取出对应的结构体,注意没有返回值 //[value3 objCType]//取出包装内容的类型 NSLog(@"%i,%i,%i",date2.year,date2.month,date2.day); //结果:2014,2,28 } int main(int argc, const char * argv[])
{ test1(); return 0; }
1.处理NSRange,方法 + (NSValue *)valueWithRange:(NSRange)range - (NSRange)rangeValue NSRange rangeA ; rangeA.location = 0 ; rangeA.location = 10 ; // 创建NSRange的值对象 NSValue *rangeValue = [NSValue valueWithRange:rangeA]; // 重新获取值对象包含的值 NSRange rangeB = [rangeValue rangeValue] ; NSLog(@"%d,%d",rangeB.location , rangeB.length) ; // 10,10
2.处理自定义结构体类型,方法 + (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type - (id)initWithBytes:(const void *)value objCType:(const char *)type - (void)getValue:(void *)buffer // 结构体定义 typedef struct{ int a ; float b ; }DataItem ; DataItem dataElemA; dataElemA.a = 10; dataElemA.b = 10.005; NSValue *value = [NSValue valueWithBytes:&dataItem objCType:@encode(DataItem)]; DataItem dataElemB; [value getValue:&dataElemB] ; NSLog(@"%d,%0.3f",dataElemB.a,dataElemB.b); // 10,10.005
3.结构体对象
// 创建点坐标结构
CGPoint point = CGPointMake(20, 20); // 将结构体转换成为NSValue对象 NSValue *pointValue = [NSValue valueWithPoint:point]; // 将NSValue对象存放到数组中 NSArray *array = @[pointValue];
// 从数组中取出pointValue对象 NSValue *value = array[0];
// 将NSValue对象转换成为结构体 CGPoint point2 = [value pointValue];
// 输出:转换成基本类型结构体point2的值: // 第一种方式:将结构体先转换为字符串然后打印
NSString *str = NSStringFromPoint(point2); NSLog(@"%@",str); // 输出 {20,20} // 第二种方式:依次取出对应的值打印 // NSLog(@"%f %f",point2.x,point2.y); 输出 20.000000 20.000000
- (void)viewDidLoad { [super viewDidLoad];
//NSValue包装指针 NSValue* start = [NSValue valueWithPointer:@selector(start:)]; NSValue* help = [NSValue valueWithPointer:@selector(help:)]; //NSArray 添加NSValue包装后的指针 NSArray *Array = [[NSArray alloc] initWithObjects:start, help, nil]; self.SelectorArray = Array; CGRect rect1 = {10, 10, 200, 200}; CGRect rect2 = {20, 20, 100, 100}; //NSValue包装CGRect结构 NSValue *aRect1 = [NSValue valueWithCGRect:rect1]; NSValue *aRect2 = [NSValue valueWithCGRect:rect2]; //NSArray 添加NSValue包装后的指针 NSArray *reArray = [[NSArray alloc] initWithObjects:aRect1, aRect2, nil]; self.RectArray = reArray; //CGAffineTransform CGAffineTransform transform1 = CGAffineTransformMakeRotation(40); CGAffineTransform transform2 = CGAffineTransformMakeRotation(-40); NSValue *aTransform1 = [NSValue valueWithCGAffineTransform:transform1]; NSValue *aTransform2 = [NSValue valueWithCGAffineTransform:transform2]; NSArray *TransArray = [[NSArray alloc] initWithObjects:aTransform1, aTransform2, nil]; self.TransformArray = TransArray;
[testView setFrame:[[RectArray objectAtIndex:0] CGRectValue]]; [testView setTransform:[[TransformArray objectAtIndex:0] CGAffineTransformValue]]; [self performSelector:[[SelectorArray objectAtIndex:0] pointerValue] withObject:nil afterDelay:0.5]; } -(void)start:(id)sender{ NSLog(@"start"); [testView setFrame:[[RectArray objectAtIndex:1] CGRectValue]]; [testView setTransform:[[TransformArray objectAtIndex:1] CGAffineTransformValue]]; [self performSelector:[[SelectorArray objectAtIndex:1] pointerValue] withObject:nil afterDelay:0.5]; } -(void)help:(id)sender{ NSLog(@"help"); //[testView setFrame:[[RectArray objectAtIndex:0] CGRectValue]]; //[testView setTransform:[[TransformArray objectAtIndex:0] CGAffineTransformValue]]; }
浙公网安备 33010602011771号