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]];
}
Objective-C中NSValue的使用的更多相关文章
- 理解Objective C 中id
什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...
- 浅谈Objective—C中的面向对象特性
Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
- objective C中的字符串NSStirng常用操作
objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的 ...
- Objective C中的ARC的修饰符的使用---- 学习笔记九
#import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...
- Objective - C中属性和点语法的使用
一.属性 属性是Objective—C 2.0定义的语法,为实例变量提供了setter.getter方法的默认实现能在一定程度上简化程序代码,并且增强实例变量的访问安全性 ...
- Objective C中数组排序几种情况的总结
总结OC中数组排序3种方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors: 数组排 ...
- Objective C中nil/Nil/NULL的区别
nil:指向oc中对象的空指针 Nil:指向oc中类的空指针 NULL:指向其他类型的空指针,如一个c类型的内存指针 NSNull:在集合对象中,表示空值的对象 若obj为nil:[obj messa ...
- objective C中数据持久化方式1--对象归档
第一.数据持久化的方式: NSKeyedArchiver--对象归档 属性列表化(NSArray.NSDictionary.NSUserDefault) SQlite数据库.CoreData数据库 其 ...
- Objective - C 中NSString (字符串)与C中的字符串转换问题
NSString是一个常用的类,NSString是原生支持unicode C中的字符串 比如char * a = "hello world"; 是utf8类型的, char* d ...
随机推荐
- 在Android上使用Google V8 JS 引擎
在cantk-runtime中直接使用的webview,通过JAVA扩展接口把Canvas的2d Context的API定向到JNI,通过OpenGL来图形加速,渲染速度大大提高.后来测试发现在大部分 ...
- robotframework笔记15
资源和变量文件 用户关键字和变量 测试用例文件 和 测试套件 初始化文件只能用于文件在哪里 了,但 资源文件 提供一种机制来分享它们. 自 资源文件结构非常接近测试用例文件,它是 容易创建它们. 变量 ...
- HTML5自学笔记[ 19 ]canvas绘图实例之炫彩时钟
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- (27)odoo 中改变菜单动作的默认视图
一个动作下面有多个视图来支持,像表单视图.列表视图.看板视图.图表视图等 这时我们想改变系统默认指定的视图,方法其实有两种,一种是通过面板改,一种是开发一个小模块 举一例:项目默认打开是用了看板视图, ...
- GetMemory
在函数中动态申请内存(虚拟内存,堆),利用指针返回值指向申请的内存.
- hdu----(1257)最少拦截系统(dp/LIS)
最少拦截系统 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- 初学java之面板布局的控制
/* * 联系网格的布控laytout *以一个棋盘为列子吧! */ import javax.swing.*; import java.awt.*; class WindGrid extends J ...
- Hive的Security配置
为了更好地使用好Hive,我将<Programming Hive>的Security章节取出来,翻译了一下. Hive还是支持相当多的权限管理功能,满足一般数据仓库的使用. Hive由一个 ...
- ocument的createDocumentFragment()方法
在<javascript高级程序设计>一书的6.3.5:创建和操作节点一节中,介绍了几种动态创建html节点的方法,其中有以下几种常见方法: · crateAttribute(name): ...
- BZOJ3999 [TJOI2015]旅游
题面:给定一个有$n$个节点的树,每个点又点权$v_i$,每次选取一条树链$[a, b]$,求出$max(v_i - v_j)$,其中$i, j \in [a, b]$且$i$出现在$j$前面,最后树 ...