浅拷贝:复制一个指针,仍然指向已经存在的内存
深拷贝:复制一个指针,并新申请一个内存
浅拷贝图解 深拷贝图解
关于拷贝的引用计数:
浅拷贝:a、不可变类型,引用计数+1;b、可变类型,引用计数不变。
深拷贝:可变类型、不可变类型,引用计数都不变
//不可变类型copy
NSArray *array = [[NSArray alloc] initWithObjects:@"123", nil];
NSLog(@"开始值: %ld 地址:%p", [array retainCount],array);
NSArray *copyArray = [array copy]; //浅拷贝
NSLog(@"copy后: %ld 地址:%p", [array retainCount],copyArray);
NSMutableArray *mutableCopyArray = [array mutableCopy]; //深拷贝
NSLog(@"mutableCopy后: %ld 地址:%p", [array retainCount],mutableCopyArray);
结果:
2018-05-04 16:16:56.354587+0800 ReviewIOS[3203:465659] 开始值: 1 地址:0x604000014850
2018-05-04 16:16:56.354761+0800 ReviewIOS[3203:465659] copy后: 2 地址:0x604000014850
2018-05-04 16:16:56.354883+0800 ReviewIOS[3203:465659] mutableCopy后: 2 地址:0x604000247500
//可变类型copy
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:@"123"];
NSLog(@"开始值: %ld 地址:%p", [array retainCount],array);
NSArray *copyArray = [array copy]; //深拷贝
NSLog(@"copy后: %ld 地址:%p", [array retainCount],copyArray);
NSMutableArray *mutableCopyArray = [array mutableCopy]; //深拷贝
NSLog(@"mutableCopy后: %ld 地址:%p", [array retainCount],mutableCopyArray);
结果:
2018-05-04 16:18:44.204876+0800 ReviewIOS[3230:468629] 开始值: 1 地址:0x6000004403f0
2018-05-04 16:18:44.205011+0800 ReviewIOS[3230:468629] copy后: 1 地址:0x60400000b770
2018-05-04 16:18:44.205153+0800 ReviewIOS[3230:468629] mutableCopy后: 1 地址:0x600000440450
关于什么情况下是深拷贝,什么情况下又是浅拷贝呢?如下图所示:
图解
总结如下:
对于不可变对象,copy为浅拷贝,mutableCopy为深拷贝;
对于可变对象,copy和mutableCopy均为深拷贝;
copy的结果为不可变对象,mutableCopy的结果为可变对象;
网友评论