Objective-C中copy的使用(深拷贝、浅拷贝详解)
来源:互联网 发布:网络推广贴吧 编辑:程序博客网 时间:2024/05/16 04:55
摘要 在Objective-C中,一个对象可以调用copy或mutableCopy方法来创建一个副本对象,本文着重讲解如何正确使用copy的功能.
首先,什么是copy?
Copy的字面意思是“复制”、“拷贝”,是一个产生副本的过程。
常见的复制有:文件复制,作用是利用一个源文件产生一个副本文件。
特点:1、修改源文件的内容,不会影响副本文件;
2、修改副本文件的内容,不会影响源文件。
OC中copy的作用是:利用一个源对象产生一个副本对象
特点:1、修改源对象的属性和行为,不会影响副本对象;
2、修改副本对象的属性和行为,不会影响源对象。
如何使用copy功能?
一个对象可以调用copy或mutableCopy方法来创建一个副本对象。
1、copy:创建的时不可变副本(如NSString、NSArray、NSDictionary)。
2、mutableCopy:创建的可变副本(如NSMutableString、NSMutableArray、NSMutableDictionary)。
使用copy功能的前提:
1、copy:需要遵守NSCopying协议,实现copyWithZone:方法。
@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end
2、mutableCopy : 需要遵守NSMutableCopying协议,实现mutableCopyWithZone:方法
@protocol NSMutableCopying
- (id)mutableCopyWithZone:(NSZone *)zone;
@end
深复制和浅复制的区别:
深复制(深拷贝、内容拷贝、deep copy):
特点:1、源对象和副本对象是不同的两个对象;
2、源对象引用计数器不变,副本对象计数器为1(因为是新产生的)。
本质:产生了新对象。
浅复制(浅拷贝、指针拷贝、shallow copy):
特点:1、源对象和副本对象是同一对象;
2、源对象(副本对象)引用计数器+1,相当于做一次retain操作。
本质:没有产生新对象。
常见的复制如下图:
只有源对象和副本对象都不可变时,才是浅复制,其他都是深复制。
关于区分深复制与浅复制的一些详细代码如下:
/**
NSMutableString调用mutableCopy : 深复制
*/
void
mutableStringMutableCopy()
{
NSMutableString *srcStr = [NSMutableString stringWithFormat:@
"age is %d"
, 10];
NSMutableString *copyStr = [srcStr mutableCopy];
[copyStr appendString:@
"abc"
];
NSLog(@
"srcStr=%@, copyStr=%@"
, srcStr, copyStr);
}
/**
NSMutableString调用copy : 深复制
*/
void
mutableStringCopy()
{
NSMutableString *srcStr = [NSMutableString stringWithFormat:@
"age is %d"
, 10];
NSString *copyStr = [srcStr copy];
[srcStr appendString:@
"abc"
];
NSLog(@
"srcStr=%p, copyStr=%p"
, srcStr, copyStr);
}
/**
NSString调用mutableCopy : 深复制
*/
void
stringMutableCopy()
{
NSString *srcStr = [NSString stringWithFormat:@
"age is %d"
, 10];
NSMutableString *copyStr = [srcStr mutableCopy];
[copyStr appendString:@
"abc"
];
NSLog(@
"srcStr=%@, copyStr=%@"
, srcStr, copyStr);
}
/**
NSString调用copy : 浅复制
*/
void
stringCopy()
{
// copy : 产生的肯定是不可变副本
// 如果是不可变对象调用copy方法产出不可变副本,那么不会产生新的对象
NSString *srcStr = [NSString stringWithFormat:@
"age is %d"
, 10];
NSString *copyStr = [srcStr copy];
NSLog(@
"%p %p"
, srcStr, copyStr);
}
@property内存管理策略的选择
1.非ARC
1> copy : 只用于NSString\block;
2> retain : 除NSString\block以外的OC对象;
3> assign : 基本数据类型、枚举、结构体(非OC对象),当2个对象相互引用,一端用retain,一端 用assign。
2.ARC
1> copy : 只用于NSString\block;
2> strong : 除NSString\block以外的OC对象;
3> weak : 当2个对象相互引用,一端用strong,一端用weak;
4> assgin : 基本数据类型、枚举、结构体(非OC对象)。
- Objective-C中copy的使用(深拷贝、浅拷贝详解)
- Objective-C 【copy的概念-深拷贝-浅拷贝】
- Objective-c中对象的Copy、MutableCopy、浅拷贝、深拷贝
- Objective-c中对象的Copy、MutableCopy、浅拷贝、深拷贝
- Objective-c中对象的Copy、MutableCopy、浅拷贝、深拷贝
- Objective-c中对象的Copy、MutableCopy、浅拷贝、深拷贝
- Objective-c中对象的Copy、MutableCopy、浅拷贝、深拷贝
- Objective-C之 深拷贝和浅拷贝、copy和mutableCopy(可以验证下)
- 深拷贝和浅拷贝(mutableCopy和Copy)详解
- 深拷贝和浅拷贝(mutableCopy和Copy)详解
- 深拷贝和浅拷贝(mutableCopy和Copy)详解
- 深拷贝和浅拷贝(mutableCopy和Copy)详解
- 深拷贝和浅拷贝(mutableCopy和Copy)详解
- 深拷贝和浅拷贝(mutableCopy和Copy)详解
- copy深拷贝和浅拷贝的理解和使用
- [Objective-C]浅拷贝和深拷贝
- Objective-C 深拷贝与浅拷贝
- Objective-C浅拷贝和深拷贝
- Android-ViewPager+Fragment数据更新问题
- java设计模式----外观模式
- 28335硬件教程-中断系统
- 获得网页的高度和宽度
- HDU 1520
- Objective-C中copy的使用(深拷贝、浅拷贝详解)
- android 定位的4种方式介绍
- 【算法学习】【图像增强】CHAHE(限制对比度自适应直方图均衡)
- 黑马程序员-----------C语言基础-----------字符串
- android 三种定位方式
- 内存管理
- xcode6 命令行运行单元测试unit test
- 欢迎使用CSDN-markdown编辑器
- Swift String 一些常用方法