Objective-C中NSValue的使用


我們在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]];   
}  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM