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 语言从入门到放弃> ...
随机推荐
- Eclipse 导入 Android studio Exception Ljava/lang/UnsatisfiedLinkEror
android studio compile fileTree(dir: 'libs', include: ['*.jar']) 没有加载so文件 main 下加入 jniLibs---so文件即可 ...
- 图形报表部署在Linux下出现乱码解决办法
客户问题: 客户的操作系统SUSE LINUX Enterprise Server 10 (i586) 64位,服务器 weblogic8.1, JDK版本:jdk1.4.系统中只有图形报表展示 ...
- Sink Prosessor - Flume的可靠性保证:故障转移、负载均衡
Flume的一些组件(如Spooling Directory Source.File Channel)能够保证agent挂掉后不丢失数据. 1.负载均衡 1)Load balancing Sink P ...
- Python 操作数据库pymysql
import pymysql #添加数据 conn , user='root', passwd='', db='yyy') #更改获取数据结果的数据类型,默认是元组,可以改为字典等:#cursor=c ...
- 在线制作GIF图片项目愿景与范围
在线制作GIF图片项目愿景与范围 a. 业务需求 a.1 背景 在当今社会中,随着聊天软件和web网站的普及,原创动画制作越来越吸引人们的眼球,一个好的动态图片,可能就会为你的网站或本人赢得更多人的认 ...
- SQL Server数据库快照的工作方式
SQL Server数据库快照的工作方式 翻译自:How Database Snapshots Work 最近有一个帖子<errorlog中的异常信息rolled forward 和rolled ...
- Btree并发内存回收
在并发写Btree原理剖析 一文中提到,节点内存回收有可能导致内存突增以及影响写性能.本文将阐述最近对内存回收的改进,多线程可并行回收内存. 回收策略 采用基于版本的机制,Btree全局维护一个版本号 ...
- mblog相关
Mblog mblog(mini blog) 是一个用Java实现的多人博客, 使用 mysql 数据库. 使用的框架: Bootstrap 3 Spring mvc Velocity Hiberna ...
- datediff
DateDiff()是计算机函数. 中文名 日期比较函数 外文名 DateDiff() 作 用 得 出两个日期之间的间隔 用 途 返回两个日期之间的差值 允许数据类型 timeinterv ...
- 12 Things Developers Will Love About Oracle Database 12c Release 2
by Chris Saxon-Oracle It's Here: Oracle Database 12c Release 2 (12.2) Is available on Oracle Cloud. ...