深拷贝与浅拷贝

1):定义:

深拷贝:对原对象真正复制了一份,复制对象指向新的内存地址;(内容复制)

浅拷贝:并没有对原对象进行复制,复制对象与原对象指向同一内存地址;(指针复制)

 

2):本质:

原对象与拷贝对象的内存地址是否一致;

 

3):释例:

非容器不可变对象(NSString)

NSString *str = @"xxxxx";

NSString *copyStr = [str copy];

NSString *mutableCopyStr = [str mutableCopy];

i):对于非容器不可变对象,copy为浅拷贝。mutableCopy为深拷贝;

ii):对于非容器不可变对象,copy为不可变对象,mutableCopy为可变对象;

非容器可变对象(NSMutableString)

NSMutableString *str = [NSMutableString stringWithString:@"非容器可变对象"];

NSMutableString *copyStr = [str copy];   

NSMutableString *mutableCopyStr = [str mutableCopy];

i):对于非容器可变对象,copy与mutableCopy为深拷贝;

ii):对于非容器可变对象,copy与mutableCopy为可变对象;

容器不可变对象(NSArray)

NSMutableString *str = [NSMutableString stringWithString:@"非容器可变对象"];

NSArray *array = [NSArray arrayWithObjects:str, @"非容器不可变对象", nil];

NSArray *copyArray = [array copy];

NSArray *mutableCopyArray = [array mutableCopy];

i):copy为浅拷贝,mutableCopy为深拷贝;

ii):copy为不可变对象,mutableCopy为可变对象;

iii):copy与mutableCopy容器内的对象与原对象类型(可变不可变),地址一致;

容器可变对象(NSMutableArray)

NSMutableString *str = [NSMutableString stringWithString:@"非容器可变对象"];

NSMutableArray *array = [NSMutableArray arrayWithObjects:str, @"非容器不可变对象", nil];

NSMutableArray *copyArray = [array copy];

NSMutableArray *mutableCopyArray = [array mutableCopy];

i):copy与mutableCopy均为深拷贝;

ii):copy出的对象不可变,mutableCopy出的对象可变;

iii):copy与mutableCopy新容器中的对象依然是浅拷贝

结论:

copy对于可变对象为深拷贝,对于不可变对象为浅拷贝;

mutableCopy始终为深拷贝

 

4):实现:

遵从NSCopying(NSMutableCopying)协议:

- (id)copyWithZone:(NSZone *)zone ;

- (id)mutableCopyWithZone:(NSZone *)zone;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值