在说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
都是深拷贝
网友评论