zoukankan      html  css  js  c++  java
  • 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]];   
    }  

  • 相关阅读:
    编程范式 epesode7,8 stack存放指针类型and heap,register
    编程范式 episode 6 实现stack 栈功能_ to do
    C 运算符优先级
    编程范式 episode3 and 4,5
    编程范式 epesode2 negative values, float 精度
    C 数据类型 长度
    memcpy code
    排序算法 2 qsort 库函数,泛型函数
    sin, miss the mark, correct our aim and try again
    排序算法 1
  • 原文地址:https://www.cnblogs.com/yeng/p/5622952.html
Copyright © 2011-2022 走看看