iOS 之深浅拷贝

1. 深浅copy的本质区别:

浅copy VS 深copy
  • 深copy: 在拷贝对象自身的时候,将底层数据也进行了复制过去。
  • 浅copy: 只拷贝容器本身,不拷贝其中的数据(只拷贝指针)
深copy

打印输出结果:


输出结果:深copy内存地址会改变

由此可见:

两个数组虽然数据一致,但是所指的内存地址不同,说明 mutableCopy 在copy的时候,进行了深copy,把array的底层数据也进行了一份copy;如果使用的浅copy,生成新的指针,指向同一个内存地址。

2.copy的几种具体使用情况

  • 字符串和容器数据的copy:

  • 可变的容器数据进行内容操作的时候,根据深浅copy,结果会不同

可变数组array,通过浅copy后生成数组array1,然后在给array新增数据

打印结果:


ADC727BA-8586-4C6A-9907-9DD4259734CD.png
  • 如果是自定义的类,一般需要遵从协议,才能对其进行copy操作,一般是使用的浅copy

协议 一般通过- (id)copyWithZone:(NSZone *)zone 方法实现

  • 如果是给指针重新赋值,则会改变其内存地址,指向新的数据所在内存
NSString * str = @"哈哈哈";
 NSString * str2 = str; //这个操作和copy是一样的处理
 NSLog(@"打印出对应的自身地址2%p  内容指针%p  内容=%@",&str2,str2,str2);
 str2 = @"嘻嘻嘻嘻"; //同一个指针,指向不同的内容地址
 NSLog(@"打印出对应的自身地址2%p  内容指针%p  内容=%@",&str2,str2,str2);
    NSLog(@"打印出对应的自身地址2%p  内容指针%p  内容=%@",&str,str,str);

输出结果:

打印出对应的自身地址20x7ffee6d25960 内容指针0x108ed9078 内容=哈哈哈
打印出对应的自身地址20x7ffee6d25960 内容指针0x108ed90d8 内容=嘻嘻嘻嘻
打印出对应的自身地址20x7ffee6d25968 内容指针0x108ed9078 内容=哈哈哈

原始str 与 str2 是 两个指向同一个内存地址的指针,但是在修改了str2 值后,str2指向了新的内存地址

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