========================================
首先给出NSStirng、NSArray、NSMutableArray三者copy/mutableCopy后的规律表格,方便有一个直观的看法。
原对象类型 | 调用的拷贝方法 | 副本对象类型 | 是否产生新对象 | 拷贝类型 |
NSString | copy | NSString | NO | 浅拷贝(指针拷贝) |
mutableCopy | NSMutableString | YES | 深拷贝(内容拷贝) | |
NSMutableString | copy | NSString | YES | 深拷贝(内容拷贝) |
mutableCopy | NSMutableString | YES | 深拷贝(内容拷贝) | |
NSArray | copy | NSArray | NO | 浅拷贝(指针拷贝) |
mutableCopy | NSMutableArray | YES | 深拷贝(内容拷贝) |
注意:对于NSDictionary、NSMutableDictionary、NSMutableArray上面的规律依然适用。
为了帮助整理,把上述表中的规律整理出来,如下所述:
浅拷贝 == 指针拷贝 == 不产生新的对象。
深拷贝 == 内容拷贝 == 会产生新的对象。
如果原对象是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一样遵守NSCopying、NSMutableCopying协议,因此不能用copy。
(更新中-----先工作)
========================================
认识下copy、strong、retain三个属性限定符。
(更新中-----先工作)
为什么block使用copy修饰符?
(更新中-----先工作)
========================================