Objective-C 中的NSValue的详解

Objective-C 中的NSValue的详解 (2013-01-28 19:16:57)转载▼
分类: Objective-C
一个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];   
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]];
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值