Objective-C中NSValue的使用

Objective-C中NSValue的使用,第1张

概述我们在C/C++开发中常会用到结构体来帮助我们简单封装基本数据类型,在Objective-C中我们也可以使用结构体来完成数据类型的封装。同时,Cocoa Touch还提供了一个NSValue来帮助我们更好地在开发中使用结构体。         我们可以使用NSValue来辅助我们实现一些简单数据结构的封装。比如我们定义了一个简单的结构体类型 typedef struct {             我们在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提供数据。


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的使用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1057181.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存