copy 有 copy 和mutableCopy
string 有 NSString NSMutableString
对应NSString 浅复制代码如下:
NSString *string = [NSString stringWithFormat:@"test"];
NSLog(@"复制前=%ld %p",[string retainCount],string);
NSString *copyString = [string copy];
NSLog(@"复制后=%ld %p",[string retainCount],string);
NSLog(@"复制的对象=%ld %p",[copyString retainCount],copyString);
测试结果如下
2015-07-30 11:02:26.875 09-test[643:303] 复制前=1 0x100108f30
2015-07-30 11:02:26.877 09-test[643:303] 复制后=2 0x100108f30
2015-07-30 11:02:26.878 09-test[643:303] 复制的对象=2 0x100108f30
对于NSString 深度复制代码如下
NSString *string = [NSString stringWithFormat:@"test"];
NSLog(@"深度复制前=%ld %p",[string retainCount],string);
NSString *copyString = [string mutableCopy];
NSLog(@"深度复制后=%ld %p",[string retainCount],string);
NSLog(@"深度复制的对象=%ld %p",[copyString retainCount],copyString);
测试结果如下:
2015-07-30 11:06:56.875 09-test[681:303] 深度复制前=1 0x1002026d0
2015-07-30 11:06:56.877 09-test[681:303] 深度复制后=1 0x1002026d0
2015-07-30 11:06:56.878 09-test[681:303] 深度复制的对象=1 0x100204400
对于NSMutableString 的浅复制
NSMutableString *string = [NSMutableString stringWithFormat:@"test"];
NSLog(@"复制前=%ld %p",[string retainCount],string);
NSMutableString *copyString = [string copy];
NSLog(@"复制后=%ld %p",[string retainCount],string);
NSLog(@"复制的对象=%ld %p",[copyString retainCount],copyString);
复制结果
2015-07-30 11:12:31.772 09-test[694:303] 复制前=1 0x100204340
2015-07-30 11:12:31.775 09-test[694:303] 复制后=1 0x100204340
2015-07-30 11:12:31.775 09-test[694:303] 复制的对象=1 0x1003017c0
对于NSMutableString 的深复制
NSMutableString *string = [NSMutableString stringWithFormat:@"test"];
NSLog(@"深度复制前=%ld %p",[string retainCount],string);
NSString *copyString = [string mutableCopy];
NSLog(@"深度复制后=%ld %p",[string retainCount],string);
NSLog(@"深度复制的对象=%ld %p",[copyString retainCount],copyString);
复制结果:
2015-07-30 11:15:06.882 09-test[706:303] 深度复制前=1 0x10010b1a0
2015-07-30 11:15:06.884 09-test[706:303] 深度复制后=1 0x10010b1a0
2015-07-30 11:15:06.885 09-test[706:303] 深度复制的对象=1 0x100401b70
总结如下:
1.对于不可变String 浅复制(copy) 是复制地址,既然有两个对象引用地址 计数器自然要加1,地址相同
2.对于不可变String 深度复制(mutableCopy)是复制对象的内容;既然复制内容,原来的对象(被复制的对象)只提供内容,引用计数器是不用增加的,复制的对象是新的对象,地址为新地址
3.对于可变String 浅复制和深复制 我是这么理解的,由于其可变性 无论深浅拷贝,都会返回新对象给你