看了几篇文章,因为文章很新手向,所以内容很繁琐。故整理一下重点,写了测试程序去了解几个知识点,不讨论基本概念。新博客wossoneri.com传送门
非集合类对象的copy与mutableCopy
//NSString & NSMutableString
NSString *strA = @"origin";
NSLog(@"strA pointer: %p content: %@", strA, strA);
NSString *strACopy = [strA copy];
NSLog(@"strCopy pointer: %p content: %@", strACopy, strACopy);
NSMutableString *strAMCopy = [strA mutableCopy];
NSLog(@"strMCopy pointer: %p content: %@", strAMCopy, strAMCopy);
NSMutableString *strB = [NSMutableString stringWithString:@"mutable string"];
NSLog(@"strB pointer: %p content: %@", strB, strB);
NSMutableString *strBCopy = [strB copy];
NSLog(@"strBCopy pointer: %p content: %@", strBCopy, strBCopy);
NSMutableString *strBMCopy = [strB mutableCopy];
NSLog(@"strBMCopy pointer: %p content: %@", strBMCopy, strBMCopy);
//输出
strA pointer: 0x100003180 content: origin
strCopy pointer: 0x100003180 content: origin
strMCopy pointer: 0x100102e90 content: origin
strB pointer: 0x100700510 content: mutable string
strBCopy pointer: 0x100700570 content: mutable string
strBMCopy pointer: 0x1006002c0 content: mutable string
在非集合类对象中:对immutable
对象进行copy
操作,是指针复制,mutableCopy
操作时内容复制;对mutable
对象进行copy
和mutableCopy
都是内容复制。
结论
- [immutableObject copy] // 浅复制
- [immutableObject mutableCopy] //深复制
- [mutableObject copy] //深复制
- [mutableObject mutableCopy] //深复制
集合类对象的copy与mutableCopy
NSArray *arrayA = @[@[@"A", @"B"], @[@"C", @"D"]];
NSLog(@"arrayA pointer:%p contentA:%p contentB:%p", arrayA, arrayA[0], arrayA[1]);
NSArray *arrCopyA = [arrayA copy];
NSLog(@"arrCopyA pointer:%p contentA:%p contentB:%p", arrCopyA, arrCopyA[0], arrCopyA[1]);
NSMutableArray *arrMCopyA = [arrayA mutableCopy];
NSLog(@"arrMCopyA pointer:%p contentA:%p contentB:%p", arrMCopyA,arrMCopyA[0], arrMCopyA[1]);
NSMutableArray *arrayB = [NSMutableArray arrayWithObjects:@[@"A", @"B"], @[@"C", @"D"], nil];
NSLog(@"arrayB pointer:%p contentA:%p contentB:%p", arrayB, arrayB[0], arrayB[1]);
NSArray *arrCopyB = [arrayB copy];
NSLog(@"arrCopyB pointer:%p contentA:%p contentB:%p", arrCopyB, arrCopyB[0], arrCopyB[1]);
NSMutableArray *arrMCopyB = [arrayB mutableCopy];
NSLog(@"arrMCopyB pointer:%p contentA:%p contentB:%p", arrMCopyB,arrMCopyB[0], arrMCopyB[1]);
//输出
arrayA pointer:0x100700860 contentA:0x100700840 contentB:0x1007007c0
arrCopyA pointer:0x100700860 contentA:0x100700840 contentB:0x1007007c0
arrMCopyA pointer:0x100700990 contentA:0x100700840 contentB:0x1007007c0
arrayB pointer:0x100701970 contentA:0x100700880 contentB:0x100701730
arrCopyB pointer:0x100102080 contentA:0x100700880 contentB:0x100701730
arrMCopyB pointer:0x100701ab0 contentA:0x100700880 contentB:0x100701730
可以看到拷贝过程和非集合类大体相同。注意一点,就是拷贝过程只是针对对象本身,而对象内部的元素还是指针复制,从上面打印的输出就可以看出来。
示例
看如下代码,有一个mutable
数组,赋值给immutable
数组
@property (nonatomic, strong) NSArray *array;
NSMutableArray *mArray = [NSMutableArray array];
[mArray addObject:@"AA"];
_array = mArray;
NSLog(@"mArray: %p, _array: %p", mArray, _array);
[mArray addObject:@"BB"];
NSLog(