我們在C/C++開發中常會用到結構體來幫助我們簡單封裝基本數據類型,在Objective-C中我們也可以使用結構體來完成數據類型的封裝。同時,Cocoa Touch還提供了一個NSValue來幫助我們更好地在開發中使用結構體。
我們可以使用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提供數據。
from: www.firnow.com):http://dev.firnow.com/course/3_program/jdkf/20100719/449960.html
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]];
}