原 IOS之NSValue整理

原 IOS之NSValue整理

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

IOS NSValue

 

值对象(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] ;

 

转载于:https://www.cnblogs.com/iOS-mt/p/4106624.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 891. 子序列宽度之和(数学)

文章目录1. 题目2. 解题1. 题目 给定一个整数数组 A ,考虑 A 的所有非空子序列。 对于任意序列 S ,设 S 的宽度是 S 的最大元素和最小元素的差。 返回 A 的所有子序列的宽度之和。 由于答案可能非常大,请返回答案模 10^97。 示例&#x…

hive建表语句_Hive数据如何同步到MaxCompute之实践讲解

摘要:本次分享主要介绍 Hive数据如何迁移到MaxCompute。MMA(MaxCompute Migration Assist)是一款MaxCompute数据迁移工具,本文将为大家介绍MMA工具的功能、技术架构和实现原理,再通过实际操作MMA,演示将Hive数据迁移到MaxCompute。…

Java 包及访问权限

文章目录1. package 包2. import3. JDK常见的包4. 访问权限5. jar 压缩1. package 包 作用:防止不同的人写的类的名称相同冲突了, package testPackage1.java; class testPg {public String talk(){return "talk()";} } class testAnother{p…

java phaser用法_第3章Phaser的使用-(java并发编程核心方法与框架)

3.1 Phaser的使用3.2 类Phaser的arriveAndAwaitAdvance()方法测试13.3 类Phaser的arriveAndAwaitAdvance()方法测试23.4 类Phaser的arriveAndDeregister()方法测试3.5 类Phaser的getPhase()和onAdvance()方法测试3.6 类Phaser的getRegisteredParties()方法和register()测试3.7 …

html选项卡_适用于Mac的最佳HTML文本编辑器,编码开发必备

一个好的文本编辑器对于想要建立网站或进行编码的任何人都是必不可少的。这对于习惯于面面俱到的环境的Mac开发人员而言更加明显。对于他们来说存在一系列不同的优质软件之选。今天小编将介绍几款Mac上好用的HTML文本编辑器,对于每一款文本编辑器,小编将…

Hive静态分区表动态分区表

静态分区表: 一级分区表: CREATE TABLE order_created_partition (orderNumber STRING, event_time STRING ) PARTITIONED BY (event_month string) ROW FORMAT DELIMITED FIELDS TERMINATED BY \t; 加载数据方式一:从本地/HDFS目录加载 loa…

java 判断请求为 ajax请求_Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求...

Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求java 判断请求是不是ajax请求,Java判断是否为ajax请求>>>>>>>>>>>>>>>>>>>>>>>>>>>>&…

python考试名词解释_python公开课|python专有名词居然有这么多,python专有名词解释已做好...

【摘要】在这个科学技术高速发展的时代,越来越多的人都开始选择学习编程软件,那么首先被大家选择的编程软件就是python,也用在各行各业之中,并被大家所熟知,所以也有越来越多的python学习者关注python专有名词解释问题…

java set hashcode_Java学习笔记_180724_HashSet_hashCode()

HashSet泛型E必须重写hashCode方法,否则会导致add结果与预期不符如class NewClass{String s;public NewClass(String s){this.ss;}overridepublic int hashCode(){//此处返回字符串s的hashCode()return s.hashCode();}}NewClass n new NewClass("1");New…

LeetCode 1773. 统计匹配检索规则的物品数量

文章目录1. 题目2. 解题1. 题目 给你一个数组 items ,其中 items[i] [typei, colori, namei] ,描述第 i 件物品的类型、颜色以及名称。 另给你一条由两个字符串 ruleKey 和 ruleValue 表示的检索规则。 如果第 i 件物品能满足下述条件之一&#xff0…

ThinkPHP(3.2)搭建简单留言板项目

1.基本业务功能 》查看所有留言功能,index/index需要一个页面,用来展示当前应用程序中所有留言信息(默认页面)。 展示形式:表格或者无序列表,这里用表格,方便些 》查看单条留言,inde…

LeetCode 1774. 最接近目标价格的甜点成本(DFS / 01背包)

文章目录1. 题目2. 解题1. 题目 你打算做甜点,现在需要购买配料。目前共有 n 种冰激凌基料和 m 种配料可供选购。而制作甜点需要遵循以下几条规则: 必须选择 一种 冰激凌基料。可以添加 一种或多种 配料,也可以不添加任何配料。每种类型的配…

java中存在对多个对象加锁的情况_Java对象锁和类锁全面解析(多线程synchronized关键字)...

最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念。最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用…

线程间通信的几种方法_并发编程中的线程间通信

线程通信的目标是使线程间能够互相发送信号。另一方面,线程通信使线程能够等待其他线程的信号。线程通信常用的方式有:wait/notify 等待Volatile 内存共享CountDownLatch 并发工具使用 ReentrantLock 结合 Condition基本LockSupport实现线程间的阻塞和唤醒方式一&am…

【IOS】Target membership

Target membership是指XCode中,一个文件属于哪一个工程,在XCode左侧的工程面板中选中一个文件,在XCode右侧的属性面板中会显示其Target Membership,如下图。 当前的文件AppDelegate.m属于书谱这个Target。 Target Membership的一些…

LeetCode 1775. 通过最少操作次数使数组的和相等(贪心+双指针)

文章目录1. 题目2. 解题1. 题目 给你两个长度可能不等的整数数组 nums1 和 nums2 。 两个数组中的所有值都在 1 到 6 之间(包含 1 和 6)。 每次操作中,你可以选择 任意 数组中的任意一个整数,将它变成 1 到 6 之间 任意 的值&am…

pythonrequest得替代_python的扩展包requests的高级用法

Python 标准库中的 urllib2 模块提供了你所需要的大多数 HTTP 功能,但是它的 API 太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。Requests 完全满足如今网络的需求。国际化域…

画箭头

$Xexittrim($exit[0]); //始点x坐标$Yexittrim($exit[1]); //始点Y坐标$Xentertrim($enter[0]); //终点X坐标$Yentertrim($enter[1]); //终点Y坐标imageline($im,$Xexit,$Yexit,$Xenter,$Yenter,$green); //画根线if($Yexit $Yenter) {if($Xexit < $Xente…

LeetCode 1776. 车队 II(单调栈)

文章目录1. 题目2. 解题1. 题目 在一条单车道上有 n 辆车&#xff0c;它们朝着同样的方向行驶。 给你一个长度为 n 的数组 cars &#xff0c;其中 cars[i] [positioni, speedi] &#xff0c;它表示&#xff1a; positioni 是第 i 辆车和道路起点之间的距离&#xff08;单位&…

wpf计算字符大小占像素_LCD作为终端显示字符串的过程

LCD作为终端显示字符串的过程1.本文目的2.资源评估3.显示原理4.嵌入式上汉字处理5.结果验证与展示6.总结1.本文目的做嵌入式图形开发&#xff0c;我们往往都会利用到各种GUI进行交互设计&#xff0c;但是对于GUI的字符串处理与中文字库显示&#xff0c;也许并不会特别关注&…