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

NSValue 类的使用的更多相关文章

  1. Objective-C:NSValue类的常见用法

    特殊类型的包装类:数组.结构体(OC内部的.自定义的).指针 // // main.m // 05-NSValue // // Created by ma c on 15/8/17. // Copyr ...

  2. 数值类对象:NSNumber,NSValue,NSNull

    基本,集合,复杂,对象 可用对象封装基本数值,然后将对象放入NSArray或NSDictionary 中. 用对象封装基本数值后,即可给其发送消息. 数值类型包括:NSNumber,NSValue,N ...

  3. NSValue NSNumber NSData类

    NSValue NSNumber NSData类 步骤1 NSValue 我们先看看NSValue能做什么: 一个NSValue对象是用来存储一个C或者Objective-C数据的简单容器.它可以保存 ...

  4. Objective-C中将结构体与联合体封装为NSValue对象

    在Clang 3.7之前,Objective-C已经可以使用类似@100.@YES.@10.5f等字面量表示一个NSNumber对象:用类似@"xxx"的字面量表示一个NSStri ...

  5. Objective-C中NSValue的使用

    我们在C/C++开发中常会用到结构体来帮助我们简单封装基本数据类型,在Objective-C中我们也可以使用结构体来完成数据类型的封装.同时,Cocoa Touch还提供了一个NSValue来帮助我们 ...

  6. (转载)OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)

    前一篇说到了Foundation框架中的NSDirctionary类,这一一篇来看一下Foundation的其他常用的类:NSNumber,NSDate,NSException. 注:其实按照Java ...

  7. NSNumber 和 NSValue 的部分使用

    1.NSNumber 在Objective-c中有int,float,char等基本数据类型,但这些基本数据类型并不是对象,而数组,字典,字符串等容器中存放的都是对象类型,因此我们需要用到NSNumb ...

  8. 02-Foundation-NSMutableString、NSNumber、NSValue、NSDate、NSArray

    目录: 一.NSMutableString可变字符串 二.NSNumber数字对象 三.NSValue 四.NSDate日期对象 五.NSArray数组对象 回到顶部 一.NSMutableStrin ...

  9. OC中常见的结构体,以及NSNumber、NSValue、NSDate的使用

    常见的结构体 NSPoint和CGPoint NSSize和CGSize NSRect 和 CGRect NSPoint和CGPoint的使用 NSPoint和CGPoint是同义的 typedef ...

随机推荐

  1. 取到 tableview 自定义section header 上的button

    在自定义的组头上,添加了一个button,在点击cell是想取到相应的组头上的button来进行操作时(比如说隐藏.是否响应点击事件等)时,我遇到了取不到所有button的问题,试过了常规的通过vie ...

  2. linux系统文件权限

    Linux文件权限详解 文件和目录权限概述 在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录.通过设定权限可以从以下三种访问方式限制访问权限:只允许 ...

  3. CXF Spring开发WebService,基于SOAP和REST方式 【转】

    官网示例 http://cxf.apache.org/docs/writing-a-service-with-spring.html http://cxf.apache.org/docs/jax-rs ...

  4. 学习laravel遇到的一些错误

    Call to undefined method Illuminate\Foundation\Application::bindShared() 错误代码 Call to undefined meth ...

  5. python 面向对象(进阶篇)

    上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  6. 实时控制软件设计第一周作业-汽车ABS软件系统案例分析

    汽车ABS软件系统案例分析 ABS 通过控制作用于车轮制动分泵上的制动管路压力,使汽车在紧急刹车时车轮不会抱死,这样就能使汽车在紧急制动时仍能保持较好的方向稳定性. ABS系统一般是在普通制动系统基础 ...

  7. 使用CXF框架集成Spring实现SOAP Web Service

  8. eclipse下导入jdk源码

    一直想好好看看jdk的源码,虽然可以直接解压jdk下的src看,但是终究不方便!后来发现可以导入到eclipse中,就在网上找了一些方法,下面就和大家分共享: step1:打开eclipse选择Win ...

  9. lucence.net+盘古分词

    第一步: 添加盘古和lucence的dll引用 第二步: 拷贝Dict文件夹到项目  demo里面是Dictionaries 不过官方建议改成Dict 然后把所有项右击属性 改为“如果较新则复制” 第 ...

  10. LUA学习笔记三·时间等操作系统库

    1.构造时间 2.时间制定格式输出 3.计时器(闭包)os.difftime (t2, t1) 返回以秒计算的时刻 t1 到 t2 的差值. (这里的时刻是由 os.time 返回的值). 在 POS ...