数值类对象:NSNumber,NSValue,NSNull
基本,集合,复杂,对象
可用对象封装基本数值,然后将对象放入NSArray或NSDictionary 中。
用对象封装基本数值后,即可给其发送消息。
数值类型包括:NSNumber,NSValue,NSNull类。
oc不支持自动装箱
NSNumber类
创建方法
+ (NSNumber *)numberWithChar:(char)value;
+ (NSNumber *)numberWithInt:(int)value;
+ (NSNumber *)numberWithFloat:(float)value;
+ (NSNumber *)numberWithDouble:(double)value;
+ (NSNumber *)numberWithBool:(BOOL)value;
+ (NSNumber *)numberWithInteger:(NSInteger)valueNS_AVAILABLE(10_5, 2_0);
创建类型后,就可以放入字典或数组中。
解除装箱,获取数据:
- (char)charValue;
- (int)intValue;
- (float)floatValue;
- (double)doubleValue;
- (BOOL)boolValue;
可以任意类型的转换
发送消息:
NSNumber 继承自NSObject;
可使用compare、isEqual等消息。
NSNumber是NSValue的子类。
NSValue可包装任意类型值。
泛型指针
void * 针对简单,复杂数据类型
id 可指向任意oc对象的指针
NSArray和NSDictionary是不支持存储基本数据类型的,所以Cocoa提供了NSNumber类用来包装基本的数据类型,如:int、char、BOOL、float..等各种有符号和无符号的基本数据类型
NSNumber
1、
+ (NSNumber *)numberWithChar:(char)value;
+ (NSNumber *)numberWithInt:(int)value;
+ (NSNumber *)numberWithFloat:(float)value;
+ (NSNumber *)numberWithBOOL:(BOOL)value;
...
...
创建NSNumber对象
NSNumber *number;
number = [NSNumber numberWithInt:123];
2、
- (char)charValue;
- (int)intValue;
- (float)floatValue;
- (BOOL)boolValue;
...
...
提取数值
[number intValue];
创建了NSNumber之后,就可以把它存储到NSArray或者NSDictionary中了:
NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];
[array addObject:number];//存储到数组中
可以用快速枚举遍历数组元素
for(NSNumber *num in array)
{
NSLog(@"%c", [num intValue]);
}
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:10];
[dic setObject:number forKey:@"1"];//存储到字典中
可以用快速枚举遍历字典元素
for(id mdic in dic)
{
NSLog(@"%c", [[dic objectForKey:mdic] intValue]);
}
通常,将一个基本类型的数据包装成对象叫做装箱(boxing),从对象中取出基本数据类型叫做取消装箱(unboxing)
NSValue
实际上NSMunber是NSValue的子类,NSValue可以包装任意一个对象,可以用NSValue将struct存到NSArray和NSDictionary中。
1、+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
创建一个NSValue
value:对象地址
objCType:通常是一个用来描述对象类型和大小的字符串,@encode可以接受一个数据类型的名称自动生成一个合适的描述字符串
2、- (void)getValue:(void *)value(出参);
从接受value的对象中
提取数值
提取的数值,存放在这个指针所指向的内存块里。
3、Cocoa提供了常用struct数据类型转换成NSValue的便捷方法:
+ (NSValue *)valueWithPoint:(NSPoint)point;
+ (NSValue *)valueWithSize:(NSSize)size;
+ (NSValue *)valueWithRect:(NSRect)rect;
- (NSPoint)pointValue;
- (NSSize)sizeValue;
- (NSRect)rectValue;
- //声明并初始化一个struct
- NSRect rtc = NSMakeRect(12, 32, 433, 343);
- //创建一个NSValue:
- //value:对象地址
- //objCType:通常是一个用来描述对象类型和大小的字符串,@encode会自动生成一个合适的描述字符串
- NSValue *value = [NSValue valueWithBytes:&rtc objCType:@encode(NSRect)];
- //把value添加到数组中
- NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];
- [array addObject:value];
- NSRect rt;
- //从数组中取到NSValue,因为只添加了一个,所以小标是0
- NSValue *v = [array objectAtIndex:0];
- //从value中取得一个NSRect,虽然返回值是void,但其实是它是利用指针返回值的
- [v getValue:&rt];
- //输出结果
- NSLog(@"%f %f %f %f", rt.origin.x, rt.origin.y, rt.size.height, rt.size.width);
- //用快速枚举遍历array并输出NSValue中struct属性的值
- for(NSValue *v in array)
- {
- NSRect rt;
- [v getValue:&rt];
- NSLog(@"%f %f %f %f", rt.origin.x, rt.origin.y, rt.size.height, rt.size.width);
- }
- /////////////////////便捷的struct转换成NAValue方式////////////////////////
- //声明并初始化一个struct
- NSRect rtc1 = NSMakeRect(100, 200, 300, 400);
- //创建一个NSValue
- NSValue *value1 = [NSValue valueWithRect:rtc1];
- //把value1添加到数组中
- NSMutableArray *array1 = [NSMutableArray arrayWithCapacity:10];
- [array1 addObject:value1];
- NSRect rt1 = [value1 rectValue];
- //输出结果
- NSLog(@"%f %f %f %f", rt1.origin.x, rt1.origin.y, rt1.size.height, rt1.size.width);
自定义类型
- typedef struct
- {
- int id;
- float height;
- unsigned char flag;
- } MyTestStruct;
- MyTestStruct myTestSturct;
- myTestSturct.id = 1;
- myTestSturct.height = 23.0;
- myTestSturct.flag = 'A';
- //封装数据
- NSValue *value = [NSValue valueWithBytes:&myTestSturct objCType:@encode(MyTestStruct)];
- //取出value中的数据
- MyTestStruct theTestStruct;
- [value getValue:&theTestStruct];//可对theTestStruct操作取得其中的数据
NSNull
在集合中不能存放nil值,因为在NSArray和NSDictionary中nil有特殊的含义。但是在有些时候,确实需要用到这样的空值,比如在字典中,电话簿中"Jack"关键字下有电话号码、家庭住址、Email等等信息,但是现在只知道他的电话号码,这种不知道其他信息的情况下为了消除一些歧义,有必要将它们设置为空,所以Cocoa提供了NSNull
NSNull只有一个方法:null
[dictionary setObject:[NSNull null], forKey:"Email"];
if(EmailAdress == [NSNull null])
{
//to do something...
}
- //声明并初始化一个struct
- NSRect rtc = NSMakeRect(12, 32, 433, 343);
- //创建一个NSValue:
- //value:对象地址
- //objCType:通常是一个用来描述对象类型和大小的字符串,@encode会自动生成一个合适的描述字符串
- NSValue *value = [NSValue valueWithBytes:&rtc objCType:@encode(NSRect)];
- //把value添加到数组中
- NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];
- [array addObject:value];
- NSRect rt;
- //从数组中取到NSValue,因为只添加了一个,所以小标是0
- NSValue *v = [array objectAtIndex:0];
- //从value中取得一个NSRect,虽然返回值是void,但其实是它是利用指针返回值的
- [v getValue:&rt];
- //输出结果
- NSLog(@"%f %f %f %f", rt.origin.x, rt.origin.y, rt.size.height, rt.size.width);
- //用快速枚举遍历array并输出NSValue中struct属性的值
- for(NSValue *v in array)
- {
- NSRect rt;
- [v getValue:&rt];
- NSLog(@"%f %f %f %f", rt.origin.x, rt.origin.y, rt.size.height, rt.size.width);
- }
- /////////////////////便捷的struct转换成NAValue方式////////////////////////
- //声明并初始化一个struct
- NSRect rtc1 = NSMakeRect(100, 200, 300, 400);
- //创建一个NSValue
- NSValue *value1 = [NSValue valueWithRect:rtc1];
- //把value1添加到数组中
- NSMutableArray *array1 = [NSMutableArray arrayWithCapacity:10];
- [array1 addObject:value1];
- NSRect rt1 = [value1 rectValue];
- //输出结果
- NSLog(@"%f %f %f %f", rt1.origin.x, rt1.origin.y, rt1.size.height, rt1.size.width); }
- //函数声明,定义时,需要出现参数类型
- //调用函数时,不出现数据类型 /1
- //若出现数据类型,则为强制转换 /2
- NSMutableArray *kbArr;
- NSMutableDictionary *kbDic;
- NSRect stRect = {1,20,200,200};
- //NSValue *vlaue = [NSValue valueWithRect:stRect];
- //1
- NSValue *vlaue = [NSValue valueWithBytes:&stRect objCType:@encode(NSRect)];
- //2
- NSValue *vlaue1 = [NSValue valueWithBytes:(const void *)&stRect objCType:(const char *)@encode(NSRect)];
- [kbArr addObject:vlaue];
- [kbDic setObject:vlaue forKey:@"stRect"];
本章总结:
掌握nsnumber类的作用,实用方法。
掌握nsvalue类的作用,实用方法。
掌握nsnull类的作用,实用方法。
数值类对象:NSNumber,NSValue,NSNull的更多相关文章
- Objective - C 值对象 NSNumber和NSValue
在进行数据处理的时候,因为对象类型的不同, 并不能进行相应的数据处理,所以必须要进行数据类型的转换,这也就是NSNumber,NSValue这两类值对象出现的原因. 简而言之,NSNumber就是实现 ...
- iOS学习14之OC NSNumber + NSValue
1.NSNumber 数值类. 作用:实现基本数据类型与OC对象类型的相互转化. 1> NSNumber创建对象 // 初始化方法 NSNumber *num1 = [[NSNumber all ...
- 黑马程序员_ Objective-c 之Foundation之NSNumber ,NSValue, NSDate
Objective-c 之Foundation之NSNumber ,NSValue, NSDate 1.NSNumber具体用法如下: 在Objective-c中有int的数据类型,那为什么还要使用数 ...
- OC NSNumber NSValue
OC NSNumber NSValue iOS的集合对象不可以存储C语言基本类型,所有可以进行装箱和拆箱,来进行OC对象操作. NSNumber包装类 普通初始化 NSNumber * num1 = ...
- CSS伪类对象before和after的用法
一直感觉这两个伪类对象不是很重要,并且IE对它两兄弟并不支持,所以也没有怎么静下心来研究,只有在清楚浮动clearfix的时候会用到哈,其他都很 少用!不过最近在研究css3的时候觉得它两个的搭配不仅 ...
- BigDecimal类对象的使用详解
双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数进行运算和处理.Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行 ...
- Integer陷阱(0~127和其他 数值相等对象比较)
Integer 类在对象中包装了一个基本类型 int 的值. 有一个陷阱存在,经常出现在面试题中,情况如下面代码 public class IntegerDemo { public static vo ...
- Math Number 数值类 包装类 数学计算 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Python类对象
python类对象 python类对象支持两种操作:属性引用和实例化. 属性引用 使用 Python 中所有属性引用所使用的标准语法: obj.name. 有效的属性名称是类对象被创建时存在于类命名空 ...
随机推荐
- .net 访问远程的MSSQL报System.AccessViolationException错误的解决方法
访问远程的数据库时 报错,本地数据库正常 netsh winsock reset --运行此命令,解决. netsh winsock reset命令,作用是重置 Winsock 目录.如果一台机器 ...
- HDU 1560 DNA sequence (IDA* 迭代加深 搜索)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1560 BFS题解:http://www.cnblogs.com/crazyapple/p/321810 ...
- .bat批处理脚本让cmd命令行提示符cd到工作目录 (转)
打开cmd,检查命令行提示符所在的默认位置(目录),进入该目录用notepad++创建一个文件,输入 @echo offrem 这个符号表示该行是注释.rem 进入f盘,需要先切换盘符,成功后才能进入 ...
- 使用Sass预定义一些常用的样式,非常方便(转)
SS预处理技术现在已经非常成熟,比较流行的有Less,Sass,Stylus,在开发过程中提升我们的工作效率,缩短开发时间,方便管理和维护代码,可以根据自己的喜好选择一款自己喜欢的工具开发,使用很接近 ...
- 小米1S MIUI V5刷回V4教程
V5确实很漂亮,但是1S只有1G的手机内存,确切说是760M左右的内存,所以运行V5卡的不行.解决小米手机刷回V4卡死在开机MI界面!! 于是,我想回到V4,虽然界面没有V5华丽,菜单没有V5扁平化, ...
- Spring+MyBatis实践—中文乱码
多种中文乱码问题及解决: jsp页面乱码 表单提交乱码 URL中文参数乱码 1.jsp页面乱码解决(2步): 新建jsp页面: <%@ page language="java" ...
- SQL 中With as 的用法
转自:http://www.cnblogs.com/superyinhai/archive/2010/04/09/1708643.html 一.WITH AS的含义 WITHAS短语,也叫做子查询部分 ...
- IDEA如何打包可运行jar的一个问题。
转自http://bglmmz.iteye.com/blog/2058785 背景: 有时候,我们会用IDEA来开发一些小工具,需要打成可运行的JAR包:或者某些项目不是WEB应用,纯粹是后台应用,发 ...
- 【HDOJ】1003 Max Sum
最开始使用递归DP解,stack overflow.化简了一些,复杂度为O(n)就过了. #include <stdio.h> int main() { int case_n, n; in ...
- comparison of floating point numbers with equality operator. possible loss of precision while rounding values
double值由外部传入 private void Compare(double value) { string text; ) //小数位后保留2位 { //小数点后保留2位小数 text = st ...