OC之复制
来源:互联网 发布:c语言函数指针 编辑:程序博客网 时间:2024/05/06 19:21
一、概念与关键字
1.复制概念
对象的复制就是复制一个对象作为副本,他会开辟一块新的内存(堆内存)来存储副本对象,就像复制文件一样,即源对象和副本对象是两块不同的内存区域。对象要具备复制功能,必须实现<NSCopying>协议或者<NSMutableCopying>协议,常用的可复制对象有:NSNumber、NSString、NSMutableString、NSArray、NSMutableArray、NSDictionary、NSMutableDictionary
浅层复制:复制引用对象的指针。
深层复制:复制引用对象内容。
2.关键字
retain:始终是浅复制。仅仅是指针引用,引用计数每次加一。返回对象是否可变与被复制的对象保持一致。
copy:对于可变对象为深复制,引用计数不改变;对于不可变对象是浅复制,
引用计数每次加一。始终返回一个不可变对象。
mutableCopy:始终是深复制,引用计数不改变。始终返回一个可变对象。
3.对象的变化
不可变对象:值发生改变,其内存首地址随之改变。
可变对象:无论值是否改变,其内存首地址都不随之改变。
引用计数:为了让使用者清楚的知道,该对象有多少个拥有者(即有多少个指针指向同一内存地址)
二、常见的复制
1.不可变对象→可变对象的转换:
NSArray *array1 = [NSArray arrayWithObjects:@"a", @"b", @"c", @"d", nil];NSMutableArray *array2 = [array1 mutableCopy];
2.可变对象→不可变对象的转换:
NSMutableArray *array2 = [NSMutableArray arrayWithObjects:@"aa",@"bb",@"cc",@"dd",nil];NSArray *array1 = [array2 Copy];
3.可变对象→可变对象的转换(不同指针变量指向不同的内存地址):
NSMutableArray *array1 = [NSMutableArray arrayWithObjects:@"a",@"b",@"c",@"d",nil];NSMutableArray *array2 = [array1 mutableCopy];
通过上边的两个例子,我们可轻松的将一个对象在可变和不可变之间转换,并且这里不用考虑内存使用原则(即引用计数的问题)
4.同类型对象之间的指针复制(不同指针变量指向同一块内存地址):
1>字符串的复制
NSMutableString *str1 = [NSMutableString stringWithString:@"two day"];NSMutableString *str2 = [str1 retain];[str1 release];2>不可变数组的复制
NSArray *array1 = [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",nil];NSArray *array2 = [array1 Copy];[array1 release];
三、总结
什么时候用到深浅拷贝?
深拷贝是在要将一个对象从可变(不可变)转为不可变(可变)或者将一个对象内容克隆一份时用到;
浅拷贝是在要复制一个对象的指针时用到。
- OC之复制
- OC之文件管理复制文件
- OC中的深浅复制
- oc笔记-深浅复制
- OC深浅复制问题
- OC深,浅复制
- oc-深浅复制
- oc 中的浅复制与深复制
- OC 浅复制和深复制
- OC深复制和浅复制
- OC中的深复制与浅复制
- OC- 属性 深复制、浅复制
- OC基础16:复制对象
- ios学习笔记之OC篇(一):复制对象的方法
- OC之OC的类
- 【IOS 开发学习总结-OC-27】★★objective-c之foundation 框架——对象复制
- OC中的深浅拷贝(深浅复制)
- oc学习笔记-复制对象
- 根据Button背景图片长宽比调整Button大小
- vi补
- 青春犹如一场盛大的演出,
- [struts]异常Caught Exception while registering Interceptor class org.crazyit.auction.action.intercepto
- tomcat之server.xml配置说明,tomcat端口说明
- OC之复制
- FileLoad附件上传本地
- 实时真实感绘制(未完)
- 【python】高阶函数 map reduce
- 使用ListFragment或SwipeRefreshListFragment构造ListView页面
- Android 两种制作圆形/圆角图片的方法
- python import 和 from.........import 模块加载和作用域
- 使用NSInputStream逐行处理大文件
- 用心写的驱动分析!!!linux设备和驱动加载的先后顺序