您的位置:首页 > 移动开发 > Objective-C

Objective-C中copy的使用(深拷贝、浅拷贝详解)

2015-08-14 14:44 676 查看
摘要 在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操作。

本质:没有产生新对象。

常见的复制如下图:





只有源对象和副本对象都不可变时,才是浅复制,其他都是深复制。

关于区分深复制与浅复制的一些详细代码如下:

?
@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对象)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: