iOS 深拷贝也浅拷贝

一. 拷贝的目地是什么?

拷贝的目地是产生一个副本对象,跟源对象互不影响
改变源对象不影响副本
改变副本对象,不影响源对象

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
image.png

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

可以看出内存地址都不一样

image.png

mutalecopy 产生的是可变对象,就会出现被修改的情况,为了避免修改可变对象的值时影响源对象,所以拷贝出一块新的内存

对可变对象不管是进行copy 还是mutablecopy都会复制一块新的内存

总结

image.png

你可能感兴趣的:(iOS 深拷贝也浅拷贝)