基本,集合,复杂,对象

可用对象封装基本数值,然后将对象放入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;

  1. //声明并初始化一个struct
  2. NSRect rtc = NSMakeRect(12, 32, 433, 343);
  3. //创建一个NSValue:
  4. //value:对象地址
  5. //objCType:通常是一个用来描述对象类型和大小的字符串,@encode会自动生成一个合适的描述字符串
  6. NSValue *value = [NSValue valueWithBytes:&rtc objCType:@encode(NSRect)];
  7. //把value添加到数组中
  8. NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];
  9. [array addObject:value];
  10. NSRect rt;
  11. //从数组中取到NSValue,因为只添加了一个,所以小标是0
  12. NSValue *v = [array objectAtIndex:0];
  13. //从value中取得一个NSRect,虽然返回值是void,但其实是它是利用指针返回值的
  14. [v getValue:&rt];
  15. //输出结果
  16. NSLog(@"%f %f %f %f", rt.origin.x, rt.origin.y, rt.size.height, rt.size.width);
  17. //用快速枚举遍历array并输出NSValue中struct属性的值
  18. for(NSValue *v in array)
  19. {
  20. NSRect rt;
  21. [v getValue:&rt];
  22. NSLog(@"%f %f %f %f", rt.origin.x, rt.origin.y, rt.size.height, rt.size.width);
  23. }
  24. /////////////////////便捷的struct转换成NAValue方式////////////////////////
  25. //声明并初始化一个struct
  26. NSRect rtc1 = NSMakeRect(100, 200, 300, 400);
  27. //创建一个NSValue
  28. NSValue *value1 = [NSValue valueWithRect:rtc1];
  29. //把value1添加到数组中
  30. NSMutableArray *array1 = [NSMutableArray arrayWithCapacity:10];
  31. [array1 addObject:value1];
  32. NSRect rt1 = [value1 rectValue];
  33. //输出结果
  34. NSLog(@"%f %f %f %f", rt1.origin.x, rt1.origin.y, rt1.size.height, rt1.size.width);

自定义类型

  1. typedef struct
  2. {
  3. int    id;
  4. float  height;
  5. unsigned char   flag;
  6. } MyTestStruct;
  7. MyTestStruct myTestSturct;
  8. myTestSturct.id = 1;
  9. myTestSturct.height = 23.0;
  10. myTestSturct.flag = 'A';
  11. //封装数据
  12. NSValue *value = [NSValue valueWithBytes:&myTestSturct objCType:@encode(MyTestStruct)];
  13. //取出value中的数据
  14. MyTestStruct  theTestStruct;
  15. [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...

}

  1. //声明并初始化一个struct
  2. NSRect rtc = NSMakeRect(12, 32, 433, 343);
  3. //创建一个NSValue:
  4. //value:对象地址
  5. //objCType:通常是一个用来描述对象类型和大小的字符串,@encode会自动生成一个合适的描述字符串
  6. NSValue *value = [NSValue valueWithBytes:&rtc objCType:@encode(NSRect)];
  7. //把value添加到数组中
  8. NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];
  9. [array addObject:value];
  10. NSRect rt;
  11. //从数组中取到NSValue,因为只添加了一个,所以小标是0
  12. NSValue *v = [array objectAtIndex:0];
  13. //从value中取得一个NSRect,虽然返回值是void,但其实是它是利用指针返回值的
  14. [v getValue:&rt];
  15. //输出结果
  16. NSLog(@"%f %f %f %f", rt.origin.x, rt.origin.y, rt.size.height, rt.size.width);
  17. //用快速枚举遍历array并输出NSValue中struct属性的值
  18. for(NSValue *v in array)
  19. {
  20. NSRect rt;
  21. [v getValue:&rt];
  22. NSLog(@"%f %f %f %f", rt.origin.x, rt.origin.y, rt.size.height, rt.size.width);
  23. }
  24. /////////////////////便捷的struct转换成NAValue方式////////////////////////
  25. //声明并初始化一个struct
  26. NSRect rtc1 = NSMakeRect(100, 200, 300, 400);
  27. //创建一个NSValue
  28. NSValue *value1 = [NSValue valueWithRect:rtc1];
  29. //把value1添加到数组中
  30. NSMutableArray *array1 = [NSMutableArray arrayWithCapacity:10];
  31. [array1 addObject:value1];
  32. NSRect rt1 = [value1 rectValue];
  33. //输出结果
  34. NSLog(@"%f %f %f %f", rt1.origin.x, rt1.origin.y, rt1.size.height, rt1.size.width);  }
  1. //函数声明,定义时,需要出现参数类型
  2. //调用函数时,不出现数据类型      /1
  3. //若出现数据类型,则为强制转换    /2
  4. NSMutableArray *kbArr;
  5. NSMutableDictionary *kbDic;
  6. NSRect stRect = {1,20,200,200};
  7. //NSValue *vlaue = [NSValue valueWithRect:stRect];
  8. //1
  9. NSValue *vlaue = [NSValue valueWithBytes:&stRect objCType:@encode(NSRect)];
  10. //2
  11. NSValue *vlaue1 = [NSValue valueWithBytes:(const void *)&stRect objCType:(const char *)@encode(NSRect)];
  12. [kbArr addObject:vlaue];
  13. [kbDic setObject:vlaue forKey:@"stRect"];

本章总结:

掌握nsnumber类的作用,实用方法。

掌握nsvalue类的作用,实用方法。

掌握nsnull类的作用,实用方法。

数值类对象:NSNumber,NSValue,NSNull的更多相关文章

  1. Objective - C 值对象 NSNumber和NSValue

    在进行数据处理的时候,因为对象类型的不同, 并不能进行相应的数据处理,所以必须要进行数据类型的转换,这也就是NSNumber,NSValue这两类值对象出现的原因. 简而言之,NSNumber就是实现 ...

  2. iOS学习14之OC NSNumber + NSValue

    1.NSNumber 数值类. 作用:实现基本数据类型与OC对象类型的相互转化. 1> NSNumber创建对象 // 初始化方法 NSNumber *num1 = [[NSNumber all ...

  3. 黑马程序员_ Objective-c 之Foundation之NSNumber ,NSValue, NSDate

    Objective-c 之Foundation之NSNumber ,NSValue, NSDate 1.NSNumber具体用法如下: 在Objective-c中有int的数据类型,那为什么还要使用数 ...

  4. OC NSNumber NSValue

    OC NSNumber NSValue iOS的集合对象不可以存储C语言基本类型,所有可以进行装箱和拆箱,来进行OC对象操作. NSNumber包装类 普通初始化 NSNumber * num1 = ...

  5. CSS伪类对象before和after的用法

    一直感觉这两个伪类对象不是很重要,并且IE对它两兄弟并不支持,所以也没有怎么静下心来研究,只有在清楚浮动clearfix的时候会用到哈,其他都很 少用!不过最近在研究css3的时候觉得它两个的搭配不仅 ...

  6. BigDecimal类对象的使用详解

    双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数进行运算和处理.Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行 ...

  7. Integer陷阱(0~127和其他 数值相等对象比较)

    Integer 类在对象中包装了一个基本类型 int 的值. 有一个陷阱存在,经常出现在面试题中,情况如下面代码 public class IntegerDemo { public static vo ...

  8. Math Number 数值类 包装类 数学计算 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. Python类对象

    python类对象 python类对象支持两种操作:属性引用和实例化. 属性引用 使用 Python 中所有属性引用所使用的标准语法: obj.name. 有效的属性名称是类对象被创建时存在于类命名空 ...

随机推荐

  1. ASP.Net 添加 Interop for Word, excel 插件

    1:在服务器上安装office的Excel软件. 2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务" 3:依次双 ...

  2. hdu 1828 Picture(线段树 || 普通hash标记)

    http://acm.hdu.edu.cn/showproblem.php?pid=1828 Picture Time Limit: 6000/2000 MS (Java/Others)    Mem ...

  3. Java之向左添加零(000001)

    int i_m = 270000 ; String str_m = String.valueOf(i_m); String str ="000000"; str_m=str.sub ...

  4. Seven Python Tools All Data Scientists Should Know How to Use

    Seven Python Tools All Data Scientists Should Know How to Use If you’re an aspiring data scientist, ...

  5. UVALive 6602 Counting Lattice Squares

    给定一个n*m的网格,求面积为奇数的正方形有多少个. 首先是n*m个面积为1的,然后剩下的要么是边长为奇数,要么被这样一个奇数边长所包围. 原因如下: 对于一个边长不平行于坐标抽的正方形,其边长一定是 ...

  6. 【HDOJ】4210 Su-domino-ku

    DLX.在模板的基础上增加一个FILL属性,略修改即可. /* 4210 */ #include <iostream> #include <string> #include & ...

  7. Java Memory Management(1)

    Java Memory Management, with its built-in garbage collection, is one of the language’s finest achiev ...

  8. PHPCMS 2008 SQL注入漏洞

    漏洞版本: PHPCMS 2008 漏洞描述: escape()方法无法过滤$genre变量进行二次URL编码,导致SQL注入漏洞产生. <* 参考 http://www.yunsec.net/ ...

  9. 兼容ie\firefox\chrome的cursor

    cursor:hand 与 cursor:pointer 的效果是一样,都像手形光标. 但用FireFox浏览时才注意到使用cursor:hand在FireFox.chorme里并被支持.cursor ...

  10. C#使用SOAP调用Web Service

    程序代码 using System;using System.IO;using System.Net;using System.Text; namespace ConsoleApplication1{ ...