浅谈深拷贝、浅拷贝

深拷贝:对象和内存地址均发生改变

浅拷贝:只是单纯地拷贝指针。其地址快并没有发生任何改变


NSString

copy:拷贝指针  不发生地址改变

mutableCopy:对象、地址都发生改变

NSMutableString

copy: 对象、地址都发生改变

mutableCopy:对象、地址都发生改变

NSDictionary

copy:拷贝指针  不发生地址改变

mutableCopy:对象、地址都发生改变

NSMutableDictionary

copy: 对象、地址都发生改变

mutableCopy:对象、地址都发生改变

NSArray

copy:拷贝指针  不发生地址改变

mutableCopy:对象、地址都发生改变

NSMutableArray

copy: 对象、地址都发生改变

mutableCopy:对象、地址都发生改变



自定义对象

copy: 对象、地址都发生改变

mutableCopy:对象、地址都发生改变


例子:

@interface ClassA

@peroroty(copy,nonamatic)NSString* name;

@end


ClassA * a1 = [Class alloc] init];

ClassA* a2 = [a1 copy];

ClassA* a3 = [a1 mutableCopy];

这里会报错 注意

因为我们并没有执行自定义类的“copyWithZone”方法

所以在ClassA中声明协议

@interface ClassA : NSObject<NSCopying, NSMutableCopying>

在在.m中写

- (instancetype) copyWithZone:(NSZone*)zone { 

 ClassA *a = [[ClassA allocWithZone:zone] init];

 a.name =self.name;//这里要进行属性变量赋值 不然copy是不会进行拷贝的

NSLog(@"没有copyWithZone自定义对象就不能copy");

return a;

}

- (instancetype) mutableCopyWithZone:(NSZone*)zone { 

ClassA *a = [[ClassA allocWithZone:zone] init];

 a.name =self.name;//这里要进行属性变量赋值 不然mutableCopy是不会进行拷贝的

NSLog(@"没有mutableCopyWithZone自定义对象就不能copy");

return a;

}



进阶:copy和strong的用法和区别

例子:

#import"ViewController.h"

@interfaceViewController()

@property(nonatomic,copy)NSString*str;

@end

@implementationViewController

- (void)viewDidLoad {

 [superviewDidLoad];

NSMutableString*strM = [[NSMutableStringalloc] initWithString:@"bestDay"];

self.str = strM;

 [strM appendString:@"OfThisYear"];

NSLog(@"str----%@---%p",self.str,self.str);

NSLog(@"strM----%@---%p",strM,strM);

}

@end


输出:

2018-04-1408:53:01.874strong修饰不同[789:18128]str----bestDay---0xa796144747365627

2018-04-1408:53:01.875strong修饰不同[789:18128]strM----bestDayOfThisYear---0x600000071280


可以看到copy修饰的str,在赋值以后,可变字符串strM发生了变化并不会影响str的值。从打印结果来看是因为二者不是一个地址,所以不会相互影响。为什么?是因为copy修饰的属性setter方法,走的是先release旧值,copy新值再赋值给成员变量,不可变copy是深拷贝,就是内容拷贝,地址变化了。


如果换成strong的话

strong修饰以后只是强指针引用,并未改变地址,所以str的值会随着strM进行变化,二者的地址也是相同的。


总结:

1.原对象和拷贝对象都是不可变对象时,为浅拷贝。

2.其他情况均为深拷贝。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,135评论 1 32
  • 深拷贝和浅拷贝这个问题在面试中常常被问到,而在实际开发中,只要稍有不慎,就会在这里出现问题。尤其对于初学者来说,我...
    西门淋雨阅读 1,810评论 0 1
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述?设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型...
    龍飝阅读 2,182评论 0 12
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类...
    司马DE晴空阅读 1,316评论 0 7
  • 忙碌总是短暂的,很多时候的忙碌也不是真正,我们把自己或者被一些事情束缚在一个地方,每天,每年,看似我们大把的时间都...
    海屿5阅读 428评论 0 0