我们可以使用NSValue来辅助我们实现一些简单数据结构的封装。比如我们定义了一个简单的结构体类型
typedef struct {
int ID,
float height,
unsigned char flag
}MyTestStruct;
此时,我们就可以使用MyTestStruct这个结构体来很容易地封装数据。如
MyTestStruct myTestStruct;
myTestStruct.ID=1;
myTestStruct.height=23.0;
myTestStruct.flag='A';
NSValue *value = [NSValue valueWithBytes:&myTestStruct objCType:@encode(MyTestStruct)];
在我们想取出*value 中的数据时,可以使用如下方式:
MyTestStruct theTestStruct;
[valeu getValue:&theTestStruct];
之后就可以对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]]; }
以上是内存溢出为你收集整理的Objective-C中NSValue的使用全部内容,希望文章能够帮你解决Objective-C中NSValue的使用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)