您的位置:首页 > 产品设计 > UI/UE

NSValue的详解

2016-06-30 11:42 381 查看
转自:http://blog.sina.com.cn/s/blog_bf9843bf0101ehs1.html

一个NSValue对象是用来存储一个C或者Objective-C数据的简单容器。它可以保存任意类型的数据,比如int,float,char,当然也可以是指pointers,
structures, and object ids。NSValue类的目标就是允许以上数据类型的数据结构能够被添加到集合里,例如那些需要其元素是对象的数据结构,如NSArray或者NSSet的实例。需要注意的是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 类的使用,还有一个地方就是我们在iPhone显示点或者其它几何图形时。比如我们想取得用户在屏幕上的点击轨迹,此时首先我们想到的就是使用 CGPoint这个结构体来保存每一次点击的数据。此时,我们就可以使用NSValue类别中的+valueWithCGPoint:来帮助我们来为CG Framework提供数据。

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   

     

//   

// 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 = [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];   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  nsvalue