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

Objective-C中NSValue的使用的更多相关文章

  1. 理解Objective C 中id

    什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...

  2. 浅谈Objective—C中的面向对象特性

    Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...

  3. objective C中的字符串NSStirng常用操作

    objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的 ...

  4. Objective C中的ARC的修饰符的使用---- 学习笔记九

    #import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...

  5. Objective - C中属性和点语法的使用

    一.属性        属性是Objective—C 2.0定义的语法,为实例变量提供了setter.getter方法的默认实现能在一定程度上简化程序代码,并且增强实例变量的访问安全性         ...

  6. Objective C中数组排序几种情况的总结

    总结OC中数组排序3种方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors: 数组排 ...

  7. Objective C中nil/Nil/NULL的区别

    nil:指向oc中对象的空指针 Nil:指向oc中类的空指针 NULL:指向其他类型的空指针,如一个c类型的内存指针 NSNull:在集合对象中,表示空值的对象 若obj为nil:[obj messa ...

  8. objective C中数据持久化方式1--对象归档

    第一.数据持久化的方式: NSKeyedArchiver--对象归档 属性列表化(NSArray.NSDictionary.NSUserDefault) SQlite数据库.CoreData数据库 其 ...

  9. Objective - C 中NSString (字符串)与C中的字符串转换问题

    NSString是一个常用的类,NSString是原生支持unicode C中的字符串 比如char * a = "hello world";  是utf8类型的, char* d ...

随机推荐

  1. JSP lifecycle - with servlet

    编译阶段: servlet容器编译servlet源文件,生成servlet类 初始化阶段: 加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法 执行阶段: 调用与JSP对应的serv ...

  2. 笔记 《Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法 》

    阅读此书的笔记点: 此书目录即是对知识点最好的总结 第1章 熟悉Objective-C ---------------------------------------------- 第1条:了解Obj ...

  3. 清理无用的CSS样式的几个工具(转)

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  4. 能源项目xml文件标签释义--default-lazy-init

    1.spring的default-lazy-init参数 spring在启动的时候,会默认加载会默认加载整个对象实例图,从初始化ACTION配置.到 service配置到dao配置.乃至到数据库连接. ...

  5. [Java] Java中List 去掉重复的值,并保持原先List顺序

    private List<YourBean> removeDuplicate(List<YourBean> list) { Set<YourBean> set = ...

  6. HTML5自学笔记[ 5 ]JSON的新方法

    eval和JSON.parse的区别:eval:可以解析任何字符串为js:parse:只能解析JSON形式的字符串变为js(更安全). json格式的字符串中的属性名必须加双引号“”. stringi ...

  7. Asp.net 解析json

    Asp.net Json数据解析的一种思路 http://www.cnblogs.com/scy251147/p/3317366.html http://tools.wx6.org/json2csha ...

  8. oracle第一章

    1.oracle对比sqlserver oracle sqlserver 数据文件.dbf 数据文件.mdf 控制文件.ctl   日志文件.log 日志文件.log     2.内置用户 1.sys ...

  9. 10 vi简介(重点)

    1.为什么学习vi? vi很多系统都预装,如果我们的系统没有图像界面,可以使用vi vi是轻量级且执行快速的编辑器 2.vi的几种模式 命令模式.插入模式.底行模式 1) 命令行模式(command ...

  10. eclipse 安装git的插件和上传项目

    这里有个链接,已经很详细的写了过程  博客1以及博客2.其实遇到安装的问题,就是因为我用的eclipse版本比较老,但是eclipse里面又装了好多插件,不想在重新安装eclipse.还有一个很好的博 ...