拷贝出一个和原对象的相同的副本,互不影响
NSString *a = [NSString stringWithFormat:@"abcabcabc"];
NSString *b = [a copy];
NSString *c = [a mutableCopy];
NSLog(@"%@,%@,%@",a,b,c);
NSLog(@"%p,%p,%p",a,b,c);
输出结果:
abcabcabc,abcabcabc,abcabcabc
0xf9f7789ebc9c00cc,0xf9f7789ebc9c00cc,0x6000011f7090
mutableCopy
得来的。因为变成NSMutableString
而且不影响之前的对象,所以要拷贝出一个新的内存空间。所以这里就引出一个概念
不可变copy 为浅拷贝
Tagged Pointer对象比较特殊。不用管理引用计数。
NSString *a = [NSString stringWithFormat:@"abc"];
NSLog(@"a retainCount = %ld",[a retainCount]);
NSString *b = [a copy];
NSLog(@"a retainCount = %ld",[a retainCount]);
NSString *c = [a mutableCopy];
NSLog(@"%@,%@,%@",a,b,c);
NSLog(@"%p,%p,%p",a,b,c);
结果
2019-09-12 13:54:58.109757+0800 Copy MutableCopy[13700:49429440] a retainCount = -1
2019-09-12 13:54:58.109876+0800 Copy MutableCopy[13700:49429440] a retainCount = -1
2019-09-12 13:54:58.109989+0800 Copy MutableCopy[13700:49429440] abc,abc,abc
2019-09-12 13:54:58.110062+0800 Copy MutableCopy[13700:49429440] 0xd5e0520931336344,0xd5e0520931336344,0x6000038d3330
由Tagged Pointed 可以知道a b 为Tagged Pointer 对象 想深入了解的的可以看一下我的上一篇文章
NSString | NSMutableString | NSArray | NSMutablArray | NSDictionary | NSMutableDictionary | |
---|---|---|---|---|---|---|
copy | 浅拷贝 | 深拷贝 | 浅拷贝 | 深拷贝 | 浅拷贝 | 深拷贝 |
mutableCopy | 深拷贝 | 深拷贝 | 深拷贝 | 深拷贝 | 深拷贝 | 深拷贝 |