您的位置:首页 > 移动开发 > IOS开发

iOS copy mutableCopy 的实现

2016-04-06 22:30 211 查看
一个对象可以调用copy或mutableCopy方法来创建一个副本对象。

1、copy:创建的时不可变副本

(如NSString、NSArray、NSDictionary)。

比如把一个对象添加字典的键值对中时,将导致调用该对象的copy方法,

而copy方法在NSObject中的实现中,将调用该对象的copyWithZone方法(NSCopying协议方法)

所以,可以不用重写copy方法,只需实现copyWithZone即可。

copyWithZone方法应该返回一个不可变副本。

2、mutableCopy:创建的可变副本

(如NSMutableString、NSMutableArray、NSMutableDictionary)

使用copy功能的前提:


1、copy:需要遵守NSCopying协议,

实现copyWithZone:方法。


2、mutableCopy : 需要遵守NSMutableCopying协议,

实现mutableCopyWithZone:

深复制和浅复制的区别:

深复制(深拷贝、内容拷贝、deep copy):


特点:1、源对象和副本对象是不同的两个对象; 


2、源对象引用计数器不变,副本对象计数器为1(因为是新产生的)。


本质:产生了新对象。


浅复制(浅拷贝、指针拷贝、shallow copy):


特点:1、源对象和副本对象是同一对象; 


2、源对象(副本对象)引用计数器+1,相当于做一次retain操作。


本质:没有产生新对象

不论源对象是否可变,copy复制出的对象都是不可变对象

不论源对象是否可变,mutableCopy复制出的对象都是可变对象

只有不可变对象的copy方式,是浅复制,其他都是深复制。

注意,以上结论仅对于字符串、数组和字典

自定义对象的复制效果取决于对应copy协议方法的实现。

另附模型copy的demo

car.h

#import <Foundation/Foundation.h>

@interface car : NSObject<NSCopying>
@property (nonatomic , copy) NSString * name;
@property (nonatomic,copy) NSString * age;
@end


car.m

#import "car.h"

@implementation car
- (instancetype)copyWithZone:(nullable NSZone *)zone{
car * tmp = [[car alloc]init];
tmp.age = self.age;
tmp.name = self.name;
return  tmp;
}
@end


现实模型的深拷贝
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: