NSValue对象是用来存储一个C或者Objective-C数据的简单容器。它可以保存任意类型的数据int,float,char等,也可以是指pointers, structures, and object ids,NSValue对象一直是不可枚举的我们可以使用NSValue来辅助我们实现一些简单数据结构的封装。比如我们定义了一个简单的结构体类型typedef struct
{
    int id;
   
    float height;
   
    unsigned char flag;
}Test;

        此时,我们就可以使用MyTestStruct这个结构体来很容易地封装数据。如

   Test test;
   
    test.id=1;
   
    test.height=23.0;
   
    test.flag='A';

    NSValue *value=[NSValue valueWithBytes:&test objCType:@encode(Test)];//对结构体进行封装
    NSLog(@"id=%d,height=%f,flag=%c",test.id,test.height,test.flag);
   

        在我们想取出*value 中的数据时,可以使用如下方式:


    Test test2;//声明test2,为了得到test1的值
    [value getValue:&test2];//同类型赋值
    NSLog(@"id=%d,height=%f,flag=%c",test2.id,test2.height,test2.flag);

之后就可以对theTestStruct的操作来取得其中的数据。

 

点开NSValue分类发现,它可以用于包装对象指针,CGRect结构体等,主要用在结构体类来设置位置时使用

@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 

比如使用toast这个三方时,可以通过

        [[UIApplication sharedApplication].keyWindow makeToast:@"登入成功" duration:1 position:[NSValue valueWithCGPoint:CGPointMake(MainScreenWidth / 2, MainScreenHeight / 4 * 3)]];来自定义设置位置

还有一个地方就是我们在iPhone显示点或者其它几何图形时。比如我们想取得用户在屏幕上的点击轨迹,此时首先我们想到的就是使用 CGPoint这个结构体来保存每一次点击的数据。此时,我们就可以使用NSValue类别中的+valueWithCGPoint:来帮助我们来为CG Framework提供数据。

- (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;   
    [Array release];   
    
    
    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;   
    [reArray release];   
    
    //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;   
    [TransArray release];   
    [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 2016-11-14 15:12  直到所有灯都熄灭了  阅读(285)  评论(0编辑  收藏  举报