深拷贝和浅拷贝

深复制和浅复制

1、概述

对象拷贝有两种方式:浅复制和深复制。

浅复制:拷贝指针

深复制:拷贝整个对象

2、深浅复制(copy、mutableCopy)

  • 不管是集合类对象,还是非集合类对象,接收到copy和mutableCopy消息时,都遵循以下准则:

    copy返回imutable对象(不可变对象);所以,如果对copy返回值使用mutable对象接口就会crash;

    mutableCopy返回mutable对象;

  • 在非集合类对象中:对immutable对象进行copy操作,是指针复制,mutableCopy操作时内容复制;对mutable对象进行copy和mutableCopy都是内容复制。

  • 在集合类对象中,对immutable对象进行copy,是指针复制,mutableCopy是内容复制;对mutable对象进行copy和mutableCopy都是内容复制。但是:集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制。

深拷贝和浅拷贝_第1张图片

3、property里的copy和strong区别

总结
  • NSString用copy修饰时,将一个可变字符串的值赋给它,此时copy属性字符串已不再指向string字符串对象,而是深拷贝了string字符串。

  • NSString用strong修饰时,将一个可变字符串赋值给它,此时strong属性字符串只不过是引用计数加1。

    将不可变字符串赋值给它,此时copy只做了浅拷贝。

NSArray *arr = @[@"21312",@"22"];
NSArray *copyarr = arr;
NSMutableArray *muarr = [arr mutableCopy];
NSLog(@"%p---%p---%p----%@----%@",arr,copyarr,muarr,arr,copyarr);

0x6080000258c0---0x6080000258c0---0x6080000598f0----(
    21312,
    22
)----(
    21312,
    22
)

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