就单纯的自己定义的类来说,copy和mutablecopy,与浅拷贝和深拷贝没有什么关系,关键是自己怎么实现NSCopying和NSMutableCopying这两个协议,如果协议实现的的时候只是拷贝指针,那就是浅拷贝,如果又申请一块内存并且把内容复制,那就是深拷贝,但是对于系统自带的容器类和NSString就要另外分了,因为协议的实现我们是看不到的,所以只能测试
NSString
首先测试NSString
- (void)testStr{
NSString *str = @"isjifsfjlsf";
NSString *str2 = [str copy];
NSString *str3 = [str mutableCopy];
NSLog(@"str:%@,%p\nstr2:%@,%p\nstr3:%@,%p",str,str,str2,str2,str3,str3);
}
结果:
str:isjifsfjlsf,0x102655078
str2:isjifsfjlsf,0x102655078
str3:isjifsfjlsf,0x6000002551b0
结果可以看出对于NSString来说copy只是拷贝的指针,而mutablecopy指针是不一样的内容一样所以是深拷贝
再来测试一下NSMutableString
- (void)testMutableStr{
NSMutableString* str = [[NSMutableString alloc]initWithString:@"hsjjdsjfjsfs"];
NSString *str2 = [str copy];
NSString *str3 = [str mutableCopy];
NSLog(@"\nstr:%@,%p\nstr2:%@,%p\nstr3:%@,%p",str,str,str2,str2,str3,str3);
}
结果:
str:hsjjdsjfjsfs,0x6040004468a0
str2:hsjjdsjfjsfs,0x60400043dfc0
str3:hsjjdsjfjsfs,0x604000446210
对于NSMutableString来说copy和mutablecopy都是深拷贝
系统容器类
拿数组来测试,先测试NSArray
- (void)testArr{
NSArray* arr = @[@"1",@"2",@"3"];
NSArray *arr1 = [arr copy];
NSArray *arr2 = [arr mutableCopy];
NSLog(@"arr:%p,arr1:%p,arr2:%p",arr,arr1,arr2);
}
结果:
arr:0x6000004512b0,arr1:0x6000004512b0,arr2:0x60000044fab0
NSArray和NSString类似,copy是浅拷贝而mutablecopy是深拷贝
测试一下NSMutableArray
- (void)testMutableArr{
NSMutableArray* arr = [NSMutableArray arrayWithObjects:@"1",@"2",@"3", nil];
NSArray *arr1 = [arr copy];
NSArray *arr2 = [arr mutableCopy];
NSLog(@"arr:%p,arr1:%p,arr2:%p",arr,arr1,arr2);
}
结果:
arr:0x604000646540,arr1:0x604000646780,arr2:0x604000646480
NSMutableArray和NSMutableString类似,copy和mutablecopy都是深拷贝