Objective-C 中的NSValue的详解
来源:互联网 发布:淘宝直播文案怎么写 编辑:程序博客网 时间:2024/05/29 09:12
Objective-C 中的NSValue的详解 (2013-01-28 19:16:57)转载▼
分类: Objective-C
一个NSValue对象是用来存储一个C或者Objective-C数据的简单容器。它可以保存任意类型的数据,比如int,float,char,当然也可以是指pointers, structures, and object ids。NSValue类的目标就是允许以上数据类型的数据结构能够被添加到集合里,例如那些需要其元素是对象的数据结构,如NSArray或者NSSet的实例。需要注意的是NSValue对象一直是不可枚举的。
我们可以使用NSValue来辅助我们实现一些简单数据结构的封装。比如我们定义了一个简单的结构体类型typedef struct
{
int id;
float height;unsigned char flag;
}Test;
此时,我们就可以使用MyTestStruct这个结构体来很容易地封装数据。如
Test test;
test.id=1;test.height=23.0;test.flag='A';NSValue *value=[NSValue valueWithBytes:&test objCType:@encode(Test)];//对结构体进行封装NSLog(@"id=%d,height=%f,flag=%c",test.id,test.height,test.flag); 在我们想取出*value 中的数据时,可以使用如下方式:Test test2;//声明test2,为了得到test1的值[value getValue:&test2];//同类型赋值NSLog(@"id=%d,height=%f,flag=%c",test2.id,test2.height,test2.flag);
之后就可以对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的详解
- Objective-C 中的NSValue的详解
- Objective-C NSValue详解
- Objective-C--- NSValue 详解 struct 结构体
- Objective-C中NSValue的使用
- Objective-C中NSValue的使用
- Objective-C中NSValue的使用
- Objective-C中NSValue的使用
- Objective-C 【NSValue】
- Objective-C --- NSValue
- Objective-C的数值类NSNumber、NSValue、NSNull
- NSValue的详解
- NSValue的详解
- Objective-C 10 NSValue和NSNull使用方法
- 【Objective-C基础】NSNumber,NSValue和NSData
- Objective-C中的@Property详解
- 黑马程序员——Objective-c——Foundation的NSValue和NSDate
- HTML5 WebGL 的 3D 仓储管理系统
- DataBinding结合RecyclerView动态加载网络数据
- RxJava2笔记(1)—Hello RxJava
- JAVA_学生管理系统(纯java语言)
- 微信公众号的代码块插入,及一键排版
- Objective-C 中的NSValue的详解
- DCT变换、DCT反变换、分块DCT变换
- java中的静态变量、静态方法与静态代码块区别
- Oulipo
- mysql查看数据库性能常用命令
- CAD2010x64 无法找到所需的动态链接库或其他文件
- idea 导入spring源码
- IE11 Windows7下F12 DOC资源管理器不能用Exception in window.onload: Error: An error has ocurredJSPlugin.3005
- 【kali linux】记一次kali linux无法获取IP地址的解决过程