ios学习路线—Objective-C(装箱和拆箱)
概述
从前面的博文我们也可以看到,数组和字典中只能存储对象类型,其他基本类型和结构体是没有办法放到数组和字典中的,当然你也是无法给它们发送消息的也就是说有些NSObject的方法是无法调用的,这个时候通常会用到装箱boxing和拆箱unboxing。
其实各种高级语言基本上都有装箱和拆 箱的过程,例如C#中我们将基本数据类型转化为Object就是一个装箱的过程,将这个Object对象转换为基 本数据类型的过程就是拆箱,而且在C#中装箱的过程可以自动完成,基本数据类型可以直接赋值给Object 对象。但是在ObjC中装箱的过程必须手动实现,ObjC不支持自动装箱。
对象的装箱和拆箱,在ObjC中我们一般将基本数据类型装箱成 NSNumber 类型当然它也是 NSObject 的子类,但是 NSNumber 不能对结构体装箱,调用其对应的方法进行转换:
+(NSNumber *)numberWithChar:(char)value;
+(NSNumber *)numberWithInt:(int)value;
+(NSNumber *)numberWithFloat:(float)value;
+(NSNumber *)numberWithDouble:(double)value;
+(NSNumber *)numberWithBool:(BOOL)value;
+(NSNumber *)numberWithInteger:(NSInteger)value;
拆箱的过程就更加简单了,可以调用如下方法:
-(char)charValue;
-(int)intValue;
-(float)floatValue;
-(double)doubleValue;
-(BOOL)boolValue;
示例
#import <Foundation/Foundation.h> /*可以存放基本类型到数组、字典*/
void test1() {
//包装类NSNumber,可以包装基本类型但是无法包装结构体类型
NSNumber *number1 = [NSNumber numberWithChar:'a'];//'a'是一个C语言的char类型我们无 法放倒NSArray中,但是我们可以通过NSNumber包装
NSArray *array1 = [NSArray arrayWithObject:number1];
NSLog(@"%@", array1);
/*结果:
(
97
) */
NSNumber *number2 = [array1 lastObject];
NSLog(@"%@", number2);//返回的不是基本类型,结果:97
char char1 = [number2 charValue];//number转化为char
NSLog(@"%c", char1); //结果:a
} int main(int argc, const char *argv[]) {
@autoreleasepool {
test1();
}
return ;
}
结构体的装箱和拆箱
上面我们看到了基本数据类型的装箱和拆箱过程,那么结构体呢? 这个时候我们需要引入另外一个类型NSValue,其实上面的NSNumber就是NSValue的子类,它包装了一些基本数据类型的常用装箱、拆箱方法,当要对结构体进行装箱、拆箱操作我们需要使用NSValue,NSValue可以对任何数据类型进行装箱、拆箱操作。
事实上对于常用的结构体Foundation已经为我们提供好了具体的装箱方法:
+(NSValue *)valueWithPoint:(NSPoint)point;
+(NSValue *)valueWithSize:(NSSize)size;
+(NSValue *)valueWithRect:(NSRect)rect;
对应的拆箱方法:
-(NSPoint)pointValue;
-(NSSize)sizeValue;
-(NSRect)rectValue;
示例
#import <Foundation/Foundation.h> //NSNumber是NSValue的子类,而NSValue可以包装任何类型,包括结构体
void test1() {
CGPoint point1 = CGPointMake(, );
NSValue *value1 = [NSValue valueWithPoint:point1];//对于系统自带类型一般都有直接的方 法进行包装
NSArray *array1 = [NSArray arrayWithObject:value1];//放倒数组中
NSLog(@"%@",array1);
/*结果:
(
"NSPoint: {10, 20}"
) */
NSValue *value2 = [array1 lastObject];
CGPoint point2 = [value2 pointValue];//同样对于系统自带的结构体有对应的取值方法(例如 本例pointValue)
NSLog(@"x=%f,y=%f", point2.x, point2.y);//结果:x=10.000000,y=20.000000
} int main(int argc, const char *argv[]) {
@autoreleasepool {
test1();
}
return ;
}
自定义的结构体类型的装箱和拆箱 如果是我们自定义的结构体类型呢,这个时候我们需要使用NSValue如下方法进行装箱:
+(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
调用下面的方法进行拆箱:
-(void)getValue:(void *)value;
示例
#import <Foundation/Foundation.h>
typedef struct {
int year;
int month;
int day;
} Date;
//NSNumber是NSValue的子类,而NSValue可以包装任何类型,包括结构体
void test1() {
//如果我们自己定义的结构体包装
Date date = {, , };
char *type = @encode(Date);
NSValue *value3 = [NSValue value:&date withObjCType:type];//第一参数传递结构体地址,第二个参数传递类型字符串
NSArray *array2 = [NSArray arrayWithObject:value3];
NSLog(@"%@", array2);
/*结果:
(
"<de070000 02000000 1c000000>"
) */
Date date2;
[value3 getValue:&date2];//取出对应的结构体,注意没有返回值
//[value3 objCType]//取出包装内容的类型 NSLog(@"%i,%i,%i",date2.year,date2.month,date2.day); //结果:2014,2,28
}
int main(int argc, const char *argv[]) {
@autoreleasepool {
test1();
}
return ;
}
ios学习路线—Objective-C(装箱和拆箱)的更多相关文章
- Java学习笔记之——自动装箱与拆箱
自动装箱与拆箱 基本类型与引用类型的互相转换 1. 基本类型对应的包装类 byte short char int long flaot double ...
- iOS开发——iOS学习路线
iOS学习路线 版权声明:欢迎转载,请贴上源地址:http://www.cnblogs.com/iCocos/(iOS梦工厂) 一:自学初步学习路线 二:高级完整学习路线 三:完整知识与能力体系 思维 ...
- ios 学习路线总结
学习方法 面对有难度的功能,不要忙着拒绝,而是挑战一下,学习更多知识. 尽量独立解决问题,而不是在遇到问题的第一想法是找人. 多学习别人开源的第三方库,能够开源的库一定有值得学习的地方,多去看别的大神 ...
- [C#] 类型学习笔记一:CLR中的类型,装箱和拆箱
在学习.NET的时候,因为一些疑问,让我打算把.NET的类型篇做一个总结.总结以三篇博文的形式呈现. 这篇博文,作为三篇博文的第一篇,主要探讨了.NET Framework中的基本类型,以及这些类型一 ...
- C#基础学习之装箱,拆箱
装箱,拆箱这两个的大条件是有继承关系. 装箱:值类型转换为引用类型 拆箱:引用类型转换为之类 但是要注意大条件. string (引用类型) int(值类型) 这个转换因为没有继承关系,内存中没 ...
- [ 转载 ]学习笔记-深入剖析Java中的装箱和拆箱
深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱 ...
- Java暗箱操作之自动装箱与拆箱
我以前在写Android项目的时候,估计写得最多最熟练的几句话就是: List<Integer> list = new ArrayList<Integer>(); list.a ...
- c#重点[数据类型,构造方法,变量,变量,运算符,装箱,拆箱]
1.命名规范 类 :名词 每个单词的首字母大写 Dog Student PersonClass 字段:首个字母小写,如果有多个单词,后面的单词首字母大写 string name=" ...
- C# 知识回顾 - 装箱与拆箱
装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 生活中的装箱与拆箱 我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃> ...
随机推荐
- nvflash 报错解决
0.首先给出nvflash官网下载地址: https://www.techpowerup.com/download/nvidia-nvflash/ 刷入命令 nvflash xxx.rom 多显卡刷入 ...
- Windows win7下VMware Virtual Ethernet Adapter未识别网络解决方法
win7下VMware Virtual Ethernet Adapter未识别网络解决方法[摘] by:授客 QQ:1033553122 问题描述 win7系统下安装VMware,查看网卡适配器设置, ...
- reportConfig.xml两种数据源连接的配置方式
在reportConfig.xml配置文件中,我们提供了两种数据源连接的配置方式,分别如下: 1.jndi数据源配置(即:在dataSource中配置) 此配置适用于在j2ee的服务器中配置了j ...
- 润乾V4导出TXT时自定义分隔符
◆ 背景说明 报表中,导出text时,默认没有分隔符:应用中对导出Text,希望能自定义分隔符.在tag中定义了 textDataSeparator属性,让用户在导出Text时自定义分隔符,从而 ...
- eval解析json字符串
场景:在springMVC,手动拼接的list,转成本json字符串后,传到前台, 解决:需要解析成json对象,获取对象的属性,动态生成table. 首先,以下是后台准备好的list,list中有两 ...
- sudo实例--企业生产环境用户权限集中管理方案实例
根据角色的不同,给不同的用户分配不同的角色1.创建初级工程师3个,网络工程师1个,中级工程师1个,经理1个 # 批量创建用户 for user in chuji{01..03} net01 ...
- 3.5星|《硅谷产品》:Facebook网红社区产品经理经验谈
硅谷产品:36讲直通世界级产品经理 作者是Facebook产品经理,目前负责的具体业务书的扉页上有含糊的介绍,书中没明确说,根据书中内容推测,主要是网红社区. 比较遗憾的是书中作者亲历的案例只有3个. ...
- 破解myeclipse10失败的一个奇葩原因
昨天开发用的myeclipse10突然弹窗提示我要激活,我清楚的记得安装时候已经破解并且看到激活信息了. 翻遍搜索出来的文章,改systemid之类的也试过了,问题依旧存在,很是绝望. 今早过来机灵了 ...
- Eclipse插件安装方法大全
1. M2e maven2插件安装 参考地址:http://www.sonatype.com/books/m2eclipse-book/reference/install-sect-marketpla ...
- Scala学习——Brief Scala Tutorial
因为Spark项目需要,学习Scala编程. 从官网文档入手:http://www.scala-lang.org/documentation/ 首先从他的Older Documentation入手. ...