Objective-C NSValue详解
来源:互联网 发布:虚拟机安装nginx 编辑:程序博客网 时间:2024/05/29 07:38
NSValue 对象是用来存储一个C或者Objective-C数据的简单容器。
它可以保存任意类型的数据,比如int,float,char,当然也可以是指pointers, structures, and object ids。
NSValue类的目标就是允许以上数据类型的数据结构能够被添加到集合里,例如那些需要其元素是对象的数据结构,如NSArray或者NSSet的实例。
需要注意的是NSValue对象 是不可枚举的。
可以使用NSValue来辅助我们实现一些简单数据结构的封装。
//如定义结构体类型:
typedef struct{
int id;
float height;
unsignedchar flag;
}Test;
使用Test 这个结构体 很容易地封装数据。
如:
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);
对于NSValue类的使用,还有一个地方就是我们在iPhone显示点或者其它几何图形时。
比如我们想取得用户在屏幕上的点击轨迹,此时首先我们想到的就是使用 CGPoint这个结构体来保存每一次点击的数据。
此时,我们就可以使用NSValue类别中的+valueWithCGPoint:来帮助我们来为CG Framework提供数据。
NSValue包装对象指针,CGRect结构体等 Demo如下:
@interface NSValue (NSValueUIGeometryExtensions)
+ (NSValue *)valueWithPointer:(constvoid *)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 = [NSValuevalueWithPointer:@selector(start:)];
NSValue* help = [NSValuevalueWithPointer:@selector(help:)];
//NSArray 添加NSValue包装后的指针
NSArray *Array = [[NSArrayalloc] 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 = [NSValuevalueWithCGRect:rect1];
NSValue *aRect2 = [NSValuevalueWithCGRect:rect2];
//NSArray 添加NSValue包装后的指针
NSArray *reArray = [[NSArrayalloc] initWithObjects:aRect1, aRect2,nil];
self.RectArray = reArray;
[reArray release];
//CGAffineTransform
CGAffineTransform transform1 =CGAffineTransformMakeRotation(40);
CGAffineTransform transform2 =CGAffineTransformMakeRotation(-40);
NSValue *aTransform1 = [NSValuevalueWithCGAffineTransform:transform1];
NSValue *aTransform2 = [NSValuevalueWithCGAffineTransform:transform2];
NSArray *TransArray = [[NSArrayalloc] 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 详解 struct 结构体
- Objective-C 中的NSValue的详解
- Objective-C中的NSValue的详解
- Objective-C 中的NSValue的详解
- Objective-C 【NSValue】
- Objective-C --- NSValue
- Objective-C中NSValue的使用
- Objective-C中NSValue的使用
- Objective-C中NSValue的使用
- Objective-C中NSValue的使用
- Objective-C 10 NSValue和NSNull使用方法
- 【Objective-C基础】NSNumber,NSValue和NSData
- Objective-c之NSString+NSMutableString+NSValue+NSAraay用法汇总
- Objective-c之NSString+NSMutableString+NSValue+NSAraay用法汇总
- Objective-C的数值类NSNumber、NSValue、NSNull
- Objective-C中使用NSValue、NSNull、NSNumber、NSDecimalNumber、NSData、NSMutableData
- Objective-C基础之NSValue包装结构体
- 14.1 结构和其他数据形式:结构体
- 14.2 结构和其他数据形式:嵌套结构
- 14.5 结构和其他数据形式:指针和结构
- 微信小程序(5)-新闻页面制作(1)
- 14.5 结构和其他数据形式:传递结构
- Objective-C NSValue详解
- Android6.0运行时权限
- 14.6 结构和其他数据形式:结构、指针、malloc()
- Apk打包与多渠道打包
- 自己写的一个打log的工具类,没啥技术含量,可以直接粘走用
- 了解Gtest中的事件机制
- 14.18.4 嵌套结构数组
- 16.3.1 用宏参数创建字符串
- cordova build app时候 提示没有gradle android studio