Objective-C NSValue详解

来源:互联网 发布:虚拟机安装nginx 编辑:程序博客网 时间:2024/05/29 07:38

NSValue  对象是用来存储一个C或者ObjectiveC数据的简单容器。


它可以保存任意类型的数据,比如intfloatchar,当然也可以是指pointers, structures, and object ids

NSValue类的目标就是允许以上数据类型的数据结构能够被添加到集合里,例如那些需要其元素是对象的数据结构,如NSArray或者NSSet的实例。

需要注意的是NSValue对象 是不可枚举的。


可以使用NSValue来辅助我们实现一些简单数据结构的封装。

//如定义结构体类型:

typedef struct{

    int id;

    

    float height;

    

    unsignedchar flag;

}Test;

        

    使用Test 这个结构体  很容易地封装数据。

   如:

   

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


对于NSValue类的使用,还有一个地方就是我们在iPhone显示点或者其它几何图形时。

比如我们想取得用户在屏幕上的点击轨迹,此时首先我们想到的就是使用 CGPoint这个结构体来保存每一次点击的数据

此时,我们就可以使用NSValue类别中的+valueWithCGPoint:来帮助我们来为CG Framework提供数据。


         NSValue包装对象指针,CGRect结构体等 Demo如下:


@interface NSValue (NSValueUIGeometryExtensions)


+ (NSValue *)valueWithPointer:(constvoid *)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

//

// NSArrayAndSelectorViewController.m

// NSArrayAndSelector

//

// Created by Lixf on 09-10-15.

// Copyright Lixf 2009. All rights reserved.

//


#import "NSArrayAndSelectorViewController.h"


@implementation NSArrayAndSelectorViewController

@synthesize SelectorArray, RectArray, TransformArray;



// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.

- (void)viewDidLoad {

    [super viewDidLoad];

    

    //NSValue包装指针

    NSValue* start = [NSValuevalueWithPointer:@selector(start:)];

    NSValue* help = [NSValuevalueWithPointer:@selector(help:)];

    

    //NSArray 添加NSValue包装后的指针

    NSArray *Array = [[NSArrayalloc] 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 = [NSValuevalueWithCGRect:rect1];

    NSValue *aRect2 = [NSValuevalueWithCGRect:rect2];

    //NSArray 添加NSValue包装后的指针

    NSArray *reArray = [[NSArrayalloc] initWithObjects:aRect1, aRect2,nil];

    self.RectArray = reArray;

    [reArray release];

    

    //CGAffineTransform

    CGAffineTransform transform1 =CGAffineTransformMakeRotation(40);

    CGAffineTransform transform2 =CGAffineTransformMakeRotation(-40);

    NSValue *aTransform1 = [NSValuevalueWithCGAffineTransform:transform1];

    NSValue *aTransform2 = [NSValuevalueWithCGAffineTransform:transform2];

    NSArray *TransArray = [[NSArrayalloc] 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]];

}


原创粉丝点击