原 IOS之NSValue整理

发表于2年前(2013-02-28 23:02)   阅读(1974) | 评论(0) 5人收藏此文章, 我要收藏
赞3
值对象(value object)概念

在面向对象的编程语言中,值对象本质上是数据元素的的对象包装器,所谓数据元素,常见的包含string,number,date类型以及其它自定义的结构体类型。Objective-C语言本身提供了string,number,date相对应的包装类,分别是NSString,NSNumber,NSDate,这些类创建的对象都可以称为值对象。但值对象本身的范围更加广泛,它可以是任何自定义类型创建的对象。

值对象作用

C语言提供了char/int/float/double基本数据类型,基于C语言的Objective-C因此同样包含了这几种基本数据类型,我们可以定义并使用这些基本数据类型的变量,也可以使用其对应的值对象,对于自定义数据类型,我们也可以将由这些类型定义的变量通过NSValue来包装成对象类型。相对于普通的变量,值对象提供了更多的功能和作用。

1.可将任何值对象存储在集合中。

在Objective-C中,诸如NSArray,NSDictionary这样的集合类所包含的元素必须是对象类型。因此基本数据类型的变量必须转换为值对象才能存储在集合中。

2.更加更加丰富的数据处理方法。

NSString或NSMulableString可以进行一系列针对字符串的操作,如字符串的连接,分割,查找,比较,提取字符等等。

NSDate和NSCaleder可进行复杂的日期处理和计算,所有这些计算都考虑了时区和闰年的影响。

NSNumber和NSDecimalNumber可以处理 char, short int, int, long int, long long int, float, or double , BOOL值,并提供了数值与字符串的转换

NSValue释义

上面我们已经提到NSValue可包装基本数据类型为对象类型,下面我们来看下Apple官方文档释义:

NSValue提供了简单的容器来包含C或Objective-C数据项。可以容纳任何基本数据类型如char,int,float,double,以及指针,结构体和对象ids。NSArray和NSSet集合类对象要求它们的元素为对象类型,NSValue的主要目的是使这些数据类型可以添加至集合中。NSValue对象是不可变类型。

简而言之,NSValue是基本数据类型或自定义数据类型所定义变量的对象包装器。

使用NSValue

1.处理NSRange,方法

1
2
+ (NSValue *)valueWithRange:(NSRange)range
- (NSRange)rangeValue

如,

1
2
3
4
5
6
7
8
9
10
11
12
13
NSRange rangeA ;
 
rangeA.location = 0 ;
 
rangeA.location = 10 ;
 
// 创建NSRange的值对象
NSValue *rangeValue = [NSValue valueWithRange:rangeA] ;
 
// 重新获取值对象包含的值
NSRange rangeB = [rangeValue rangeValue] ;
 
NSLog(@"%d,%d",rangeB.location , rangeB.length) ; // 10,10

2.处理自定义结构体类型,方法

1
2
3
+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type
- (id)initWithBytes:(const void *)value objCType:(const char *)type
- (void)getValue:(void *)buffer

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 结构体定义
typedef struct{
   int a ;
   float b ;   
}DataItem ;
 
DataItem dataElemA  ;
     
dataElemA.a = 10 ;
     
dataElemA.b = 10.005 ;
     
NSValue *value = [NSValue valueWithBytes:&dataItem objCType:@encode(DataItem)] ;
     
DataItem dataElemB ;
     
[value getValue:&dataElemB] ;
     
NSLog(@"%d,%0.3f",dataElemB.a,dataElemB.b); // 10,10.005

自定义类型必须是固定长度类型,不能将C字符串,可变长度的数组和结构体,以及其它变长类型存储在NSValue中,这些可变类型应该使用NSString或NSData来包装成对象类型。但可以将可变数据类型的指针保存在NSValue中,官方文档示例: 
    
        原意想要保存myCString到NSValue中,但实际上myCString是以char的指针类型进行解析的,所以字符串的前四个字节被当做了指针的值,而不是地址值来对待。

1
2
3
4
5
6
7
8
9
10
11
12
13
/* INCORRECT! */
 
char *myCString = "This is a string.";
 
NSValue *theValue = [NSValue valueWithBytes:myCString objCType:@encode(char *)];
 
char *cc = (char*)malloc(sizeof(char*)*200) ;
    
[theValue getValue:cc];
   
prinf("%s" , cc)  ; // This
    
free(cc)

正确的做法是保存字符串到NSString中,如,

1
2
3
char *myCString = "This is a string.";
    
NSString myNsString = [NSString stringWithCString:myCString encoding:NSUTF8StringEncoding] ;

或者,保存该字符串的指针地址到NSValue中,如,

1
2
3
4
5
6
7
8
9
10
11
12
13
char *myCString = "This is a string.";
    
NSValue *theValue = [NSValue valueWithBytes:&myCString objCType:@encode(char **)];
     
 char **cc = (char**)malloc(sizeof(char**)*200) ;
    
[theValue getValue:cc];
     
printf("----%s----" , *cc); // This is a string.
    
free(cc) ;
 
cc = NULL ;

3.处理指针类型,方法

1
2
+ (NSValue *)valueWithPointer:(const void *)aPointer
- (void *)pointerValue

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DataItem *dd = (DataItem*)malloc(sizeof(DataItem)) ;
 
dd->a = 1 ;
 
dd->b = 2 ;
     
NSValue *pValue = [NSValue valueWithPointer:dd] ;
     
DataItem *dc = (DataItem*)[pValue pointerValue] ;
     
NSLog(@"%d,%0.3f",dc->a,dc->b);
     
free(dd) ;
     
dd = NULL ;
     
dc = NULL ;

NSValue的分类

UIKit Additions

提供了Function框架中关于几何数据类型结构体的对象值包装,包括CGPoint,CGRect,CGSize,CGAffineTransform,UIEdgeInsets,UIOffset。

以CGPoint为例(其它的结构体都有相对应的方法),方法

1
2
+ (NSValue *)valueWithCGPoint:(CGPoint)point
- (CGPoint)CGPointValue

如:

1
2
3
4
5
6
7
8
9
CGPoint origin = CGPointMake(10.0 , 10.0) ;
         
NSValue *ptValue = [NSValue valueWithCGPoint:origin] ;
         
NSArray *ptArr = [NSArray arrayWithObject:ptValue];
         
NSValue *ptValueB = [ptArr objectAtIndex:0] ;
         
CGPoint originB = [ptValueB CGPointValue] ;

 

原 IOS之NSValue整理的更多相关文章

  1. 原 iOS面试题收集

    原 iOS面试题收集 发表于2年前(2013-07-22 13:47)   阅读(369) | 评论(0) 4人收藏此文章, 我要收藏 赞0 听云性能监测产品App.Server.CDN免费试用,绑定 ...

  2. iOS面试题整理带答案

    iOS面试题整理带答案       找工作,面试是避免不了的! 而技术开发面试,问一些技术相关的问题是必须的,最新的技术可能人人都趋之若鹜,但有些原理和基础的也希望都有了解. 这里整理了一些iOS相关 ...

  3. iOS 学习资料整理

    iOS学习资料整理 https://github.com/NunchakusHuang/trip-to-iOS 很好的个人博客 http://www.cnblogs.com/ygm900/ 开发笔记 ...

  4. 原 iOS深入学习(Block全面分析)http://my.oschina.net/leejan97/blog/268536

    原 iOS深入学习(Block全面分析) 发表于1年前(2014-05-24 16:45)   阅读(26949) | 评论(14) 39人收藏此文章, 我要收藏 赞21 12月12日北京OSC源创会 ...

  5. 兼容iOS 10 资料整理笔记

    原文链接:http://www.jianshu.com/p/0cc7aad638d9 1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化 ...

  6. IOS UI 笔记整理回顾

    注意手势会冒泡上抛,一个view没有实现的手势,如果父类view有实现,父视图就处理,如果不想让父视图处理,就把本视图添加到底层window上 setMasksToBounds:YES imageVi ...

  7. iOS 视频播放方式整理

    初衷 多媒体这整个系列的文章自己也准备好开始整理了,先从视频音频最简单也是最常用的播放出发慢慢的往下深究,探索到底层的编码解码等等,这篇文章就从视频的播放这个最简单的说起. iOS的视频播放方式有几种 ...

  8. 关于新版本,iOS10的相关内容,兼容iOS 10 资料整理笔记

    1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大改重构,这让开发者也体会到UserN ...

  9. iOS 面试题整理(带答案)二

    第一篇面试题整理: http://www.cocoachina.com/bbs/read.php?tid-459620.html 本篇面试题同样:如答案有问题,欢迎指正! 1.回答person的ret ...

随机推荐

  1. Spring事务-三种实现方式

    一.引入JAR文件: 二.开始搭建分层架构---创建账户(Account)和股票(Stock)实体类 Account: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

  2. OBJ解析

    OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,很适合用于3D软件模 ...

  3. SQL string类型的数据按int类型排序 分类: SQL Server 2014-12-08 16:56 393人阅读 评论(0) 收藏

    说明: 我在做wms进销存软件时,发现一个问题:一张入库单(T_OutIn_BoxTop),入库扫描时要分成多箱,箱号(BoxTop_No)可以是数字也可以是字符串,所以箱号只能是字符串类型的,问题来 ...

  4. mysql 统计 每天累计用户数

    需求: 查出 一段时间每天的累计用户, 数据库这么设计的, 只有一张用户表, 每个用户注册的时间, 每一天的数据是之前的天数累计 select count(id) from r_user where ...

  5. android-----JNI学习 helloworld

    (1)新建android工程 (2)添加NDK路径 (3)添加本地支持 给本地库起名 此时工程目录下会自动生成jni文件夹 此时Makefile也自动生成 LOCAL_PATH := $(call m ...

  6. mac下修改mysql的默认字符集为utf8

    1,检查默认安装的mysql的字符集 mysql> show variables like '%char%'; +--------------------------+------------- ...

  7. char* 和char[]的差别

    下面内容均来自互联网,系笔者汇总并总结. 1. 问题介绍 问题引入: 在实习过程中发现了一个曾经一直默认的错误,相同char *c = "abc"和char c[]="a ...

  8. 深入分析 Java I/O 的工作机制--转载

    Java 的 I/O 类库的基本架构 I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道.在当今这个数据大爆炸时代, ...

  9. media query

    accepted Another useful media feature is device-aspect-ratio. Note that the iPhone 5 does not have a ...

  10. Markdown写接口文档,自动添加TOC

    上回说到,用Impress.js代替PPT来做项目展示.这回换Markdown来做接口文档好了.(不敢说代替Word,只能说个人感觉更为方便)当然,还要辅之以Git,来方便版本管理. Markdown ...