深拷贝/浅拷贝的理解

1、先了解下变量名、变量值、指针地址三者的关系

2、为什么不用直接赋值的方式,再一次认识下可变对象和不可变对象

3、然后一定要先弄清楚深拷贝和浅拷贝的目的是干嘛,可变对象和不可变对象拷贝的区别

4、特殊对象的深浅拷贝,比如容器类

5、估计还要了解下内存管理方面的事情,还有各种内存区,比如,堆区、栈区、等等的了解

直接赋值,仅仅是创建了内存中同一对象的另一个引用。

使用拷贝的目的是,对该内容的独立使用,不想受到“他人”的影响。

========================================

首先给出NSStirngNSArrayNSMutableArray三者copy/mutableCopy后的规律表格,方便有一个直观的看法。

原对象类型

调用的拷贝方法

 副本对象类型  是否产生新对象  拷贝类型
NSString copy NSString NO 浅拷贝(指针拷贝)
  mutableCopy NSMutableString YES 深拷贝(内容拷贝)
         
NSMutableString copy NSString YES 深拷贝(内容拷贝)
  mutableCopy NSMutableString YES 深拷贝(内容拷贝)
         
NSArray copy  NSArray NO 浅拷贝(指针拷贝)
  mutableCopy NSMutableArray YES 深拷贝(内容拷贝)

注意:对于NSDictionaryNSMutableDictionaryNSMutableArray上面的规律依然适用。

 

为了帮助整理,把上述表中的规律整理出来,如下所述:

浅拷贝 == 指针拷贝 == 不产生新的对象。

深拷贝 == 内容拷贝 == 会产生新的对象。

 

如果原对象是mutable类型,那么不管调用copy还是mutableCopy,都是深拷贝。

如果原对象是imutable类型,那么copy就是浅拷贝,mutableCopy就是深拷贝。

 

【误区纠正】调用copy就是浅拷贝,调用mutableCopy就是深拷贝。这样的理解是错误的!

========================================

指针与存储的数据之间的关系,这块知识在C语言中讲得比较明白。

【文章推荐http://c.biancheng.net/cpp/html/490.html

 

int a = 8

int b = &a

等价于

int *c = 8

首先,计算机会在内存中使用一块内存空间,内存空间的最小单位是字节。在DOS下的16位编程中int类型的数据需要2个字节,没个字节都是有自己的编号(也就是地址)。然后在这段空间中存储下8这个数据,当然用的是二进制。—————到此为止,这段内存空间是真真实实存在的,也是的确存储了8这个数据的。然后呢,给出一个表格,各自体会。

变量名 存储空间 内存地址
a 8

0x10025656

b

0x10025656

0x14236897
c 0x10025656 0x18943589

========================================

需要真实明白什么就指针拷贝与内容拷贝。

下面从一行代码为切入点进行分析:

 

Person *p = [[Person alloc] init];

 

Person p

这句话,仅仅声明了一个变量而已。并且这个变量的类型是Person类型。

同时p是一个局部变量,所以p变量是存储在栈区的。

p*放在一起表示p变量是一个指针变量,既然是指针变量,那么p只能存储一个内存地址。

本质上来说,p是一个指针变量而不是一个对象,p中存放的是某一块内存区域的首地址。

 

[[Person alloc] init]

alloc在堆区开辟了一块内存空间,用来存放Person类的一个具体对象。

init是进行了一些初始化的操作。

 

Person *p = [[Person alloc] init];

这句话的意思是将等号后面的生成的具体对象的地址赋值给了p这个指针变量。

并且这个过程该具体对象被强引用一次,引用计数+1

 

指针拷贝指的就是将对象p的地址复制一份给另一个指针变量。

内容拷贝指的是再开辟一块内存空间用来放置一个对象p,然后将这块新内存空间的地址给另一个指针变量。

========================================

集合对象的单层深拷贝、双层深拷贝、完全深拷贝。

 (更新中-----先工作)

========================================

为什么UIView不能使用copy属性限定符、copy方法?

因为UIView及其父类并没有像NSArray一样遵守NSCopyingNSMutableCopying协议,因此不能用copy

 (更新中-----先工作)

========================================

认识下copystrongretain三个属性限定符。

(更新中-----先工作) 

 

为什么block使用copy修饰符?

(更新中-----先工作)

========================================

 

 

 

 

 

原文地址:https://www.cnblogs.com/cchHers/p/8808224.html