为什么80%的码农都做不了架构师?>>>   

值对象(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,方法

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

如,

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.处理自定义结构体类型,方法

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

如:

// 结构体定义
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的指针类型进行解析的,所以字符串的前四个字节被当做了指针的值,而不是地址值来对待。

/* 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)  ; // Thisfree(cc)

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

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

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

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.处理指针类型,方法

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

如:

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为例(其它的结构体都有相对应的方法),方法

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

如:

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] ;

Core Animation Additions

提供CATransform3D结构体的对象值包装

MapKit Additions

提供CLLocationCoordinate2D和MKCoordinateSpan结构体的对象包装

转载于:https://my.oschina.net/hmj/blog/110984

IOS之NSValue整理相关推荐

  1. 原 IOS之NSValue整理

    原 IOS之NSValue整理 发表于2年前(2013-02-28 23:02)   阅读(1974) | 评论(0) 5人收藏此文章, 我要收藏 赞3 IOS NSValue 值对象(value o ...

  2. 【环信IM集成指南】iOS端常见问题整理(1)

    1.集成IM如何自定义添加表情组 集成环信IM自定义添加表情组 - IM Geek开发者社区-移动开发者社区-开源社区-IM Geek官网 2.旧版音视频与EaseCallKit兼容升级方案 旧版音视 ...

  3. 【环信IM集成指南】iOS端常见问题整理(2)

    [环信IM集成指南]iOS端常见问题整理(1-15) 16.后端该如何操作用户上麦 后端无法直接控制让谁上麦,所以只能通过发送CMD消息的方式来和移动端进行交互,移动端根据逻辑指令去操作 17.使用[ ...

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

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

  5. ios远程服务器,整理一下苹果手机ios远程联机教程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 整理一下这几天所了解的苹果手机ios远程联机教程. 以下纯手打的,有需要的认真看完. 声明:以下只是本人整理给新人看的,让大家少走弯路,希望越来越多ios ...

  6. iOS 开发工具整理

    一.前言 俗话说的好,工欲善其事,必先利其器,小时侯就学习过一篇文章叫<磨刀不误砍柴工>,所以对也我们开发者来讲,拥有了好的开发工具可以让我们的工作效率大大提升,所以我在此整理了我工作中所 ...

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

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

  8. iOS 模块化进阶整理记录

    先说模块化可能给项目带来的改变: 代码提交更规范,分工更为明确,质量提高 编译加快 在原模式中,需要 150s 左右整个编译完毕,然后开发人员才可以开始调试.而现在组件化之后,某个业务组件只需要 10 ...

  9. 个推消息推送iOS版常见问题整理

    为了更好地服务开发者,此次我们针对个推消息推送iOS版使用中可能出现的一些常见问题做了整理,提供了一些比较方便掌握的解决方法,希望能帮助到大家. 1. iOS推送流程是什么样的? iOS下发的消息分两 ...

最新文章

  1. 未来的全能保姆机器人作文_保姆机器人作文500字
  2. 自动化才能解放安全团队
  3. 凭啥Java运行环境称虚拟机 Python只能称解释器
  4. ora-00054:resource busy and acquire with nowait specified解决方法
  5. 采样频率和带宽的关系_基于矢量网络分析仪的 TDR 与传统采样示波器 TDR 之间的测量性能和优势比较...
  6. C#中static void Main(string[ ] args)中的作用及解释
  7. impala sql清单
  8. python自动测试v_python下selenium自动化测试自我实践
  9. 【tool】关于oracle数据库的安装与使用
  10. Zend Studio9.02 字体显示,WIN7系统
  11. nginx源码安装及配置https自签名
  12. Java软件开发技术交流群
  13. java登录验证_java实现登录验证码
  14. linux中IGV的运行,科学网—使用UCSC和IGV查看reads在基因组上分布情况 - 熊朝亮的博文...
  15. 51Nod 1463
  16. 文件管理(文件系统)
  17. 转载《士兵突击》观后杂感
  18. 【裸金属服务器】安装VMware ESXi
  19. Excel下拉菜单怎么做?Leo老师来教你!
  20. php三种常用的加密解密算法

热门文章

  1. CDays-3 习题二 (字典及文件读取练习)及相关内容解析。Python 基础教程
  2. Django项目部署到Linux后,上传文件的时候,mkdirs创建目录OSError - Errno 13 Permission denied
  3. Java远程连接进程
  4. 设计模式之不简单的工厂模式(三)
  5. 用Java描述数据结构之二叉树,前序遍历,中序遍历,后序遍历
  6. c++11 string转ing_pdfkit | 利用python实现html文件转pdf
  7. linux 如何解压.exe,linux下解压火狐浏览器压缩包 ./filefox 运行可执行程序报错问题...
  8. vue中既可以选择又可以手动输入的文本框类型_在PPT中制作一个胖乎乎的可爱圆环图...
  9. PostgreSQL统计信息的几个重要视图
  10. 机器视觉产品技术市场需求日益增长