玩转深拷贝/浅拷贝

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

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

原对象类型

调用的拷贝方法

 副本对象类型 是否产生新对象 拷贝类型
NSStringcopyNSStringNO浅拷贝(指针拷贝)
 mutableCopyNSMutableStringYES深拷贝(内容拷贝)
     
NSMutableStringcopyNSStringYES深拷贝(内容拷贝)
 mutableCopyNSMutableStringYES深拷贝(内容拷贝)
     
NSArraycopy NSArrayNO浅拷贝(指针拷贝)
 mutableCopyNSMutableArrayYES深拷贝(内容拷贝)

注意:对于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这个数据的。然后呢,给出一个表格,各自体会。

变量名存储空间内存地址
a8

0x10025656

b

0x10025656

0x14236897
c0x100256560x18943589

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

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

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

 

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值