iOS:重新认识Copy

在说Copy之前,我们需要了解copy的目的的是什么?

Copy目的其实就是产生一个副本对象,副本对象跟源对象互相不影响
修改源对象,不会影响副本对象
修改副本对象,不会影响源对象

再看iOS给我们提供了两个拷贝的方法:

1.copy:不可变拷贝,产生不可变副本
2.mutableCopy:可变拷贝,产生可变副本

再来认识一下深拷贝浅拷贝

深拷贝:内容拷贝,产生新的对象
浅拷贝:指针拷贝,没有产生新的对象

我们举个:
我们使用NSString,NSMutableString来做一个对比


//  NSString
NSString *a = @"123";
NSString *aCopy = [a copy];
NSString *aMutableCopy = [a mutableCopy];        
NSLog(@"a --- %p, aCopy -- %p  aMCopy -- %p",a,aCopy,aMutableCopy);

-------------- log ----------------------
a --- 0x100001050, aCopy -- 0x100001050  aMCopy -- 0x102405630

/*
因为NSString是不可变的,使用copy也只是变为不可变副本,所以使用一块内存也互不干扰,所以NSString的copy是浅拷贝
当NSString使用mutableCopy,拷贝出来的的可变副本对象要与源对象互不干扰的情况下,那么就得开辟内存,重新创建一个新对象,所以是深拷贝
*/



// NSMutableString
NSMutableString *a = [[NSMutableString alloc]initWithString:@"aaaaaaaaaaaaaaa"];
NSString *aCopy = [a copy];
NSString *aMutableCopy = [a mutableCopy];
NSLog(@"a --- %p, aCopy -- %p  aMCopy -- %p",a,aCopy,aMutableCopy);

-------------- log ----------------------
a --- 0x100512ba0, aCopy -- 0x100512c60  aMCopy -- 0x100512c90

/*
NSMutableString是可变字符串,当拷贝出来的副本对象要与源对象互不干扰,所以NSMutableString得拷贝都是深拷贝
*/

copy mutableCopy
NSString 浅拷贝 深拷贝
NSMutableString 深拷贝 深拷贝
NSArray 浅拷贝 深拷贝
NSMutableArray 深拷贝 深拷贝
NSDictionary 浅拷贝 深拷贝
NSMutableDictionary 深拷贝 深拷贝

总结:不可变类型copy都是浅拷贝,不可变类型mutableCopy都是深拷贝,可变类型copy,mutableCopy都是深拷贝

你可能感兴趣的:(iOS:重新认识Copy)