iOS 深拷贝也浅拷贝
2019-12-11 本文已影响0人
Q妹_
一. 拷贝的目地是什么?
拷贝的目地是产生一个副本对象,跟源对象互不影响
改变源对象不影响副本
改变副本对象,不影响源对象
iOS提供两个拷贝方法
1.copy 不可变拷贝,产生不可变副本
2.mutablecopy 可变拷贝,产生可变副本
NSString *str = [[NSString alloc] initWithFormat:@"test"];
NSString *str1 = [str copy];
NSString *str2 = [str mutableCopy];
NSLog(@"%p",str);
NSLog(@"%p",str1);
NSLog(@"%p",str2);
不可变对象进行copy产生的是不可变对象,源对象本身也不可变,就不会出现被修改的情况,所以返回回来的是本身,两个对象指向一块内存
//打印结果
2019-12-08 22:12:54.055760+0800 TestDemo[4293:181329] 0x100c181b8
2019-12-08 22:12:54.055897+0800 TestDemo[4293:181329] 0x100c181b8
2019-12-08 22:12:54.056238+0800 TestDemo[4293:181329] 0x60000243c0c0

NSMutableString
NSMutableString *str = [NSMutableString stringWithFormat:@"test"];
NSString *str1 = [str copy];
NSMutableString *str2 = [str mutableCopy];
NSLog(@"%p",str);
NSLog(@"%p",str1);
NSLog(@"%p",str2);
//打印结果
2019-12-08 22:31:35.812314+0800 TestDemo[4474:194204] 0x6000028cae20
2019-12-08 22:31:35.812444+0800 TestDemo[4474:194204] 0xc95bad41985c61a8
2019-12-08 22:31:35.812520+0800 TestDemo[4474:194204] 0x6000028cad90
可以看出内存地址都不一样

mutalecopy 产生的是可变对象,就会出现被修改的情况,为了避免修改可变对象的值时影响源对象,所以拷贝出一块新的内存
对可变对象不管是进行copy 还是mutablecopy都会复制一块新的内存
总结
