NSValue

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

 

 
posted on 2015-07-22 11:22  pTrack  阅读(178)  评论(0)    收藏  举报