浅拷贝
浅拷贝是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。如:
char* str = (char*)malloc(100);
char* str2 = str;
浅拷贝只是对对象的简单拷贝,让几个对象共用一片内存,当内存销毁的时候,指向这片内存的几个指针需要重新定义才能使用,要不然会成为野指针。
iOS中的浅拷贝
在iOS中,retain关键字就是一种更加保险的浅拷贝。它既能让几个指针共用同一片内存空间,又可以在release方法中不会轻易的销毁内存,达到更加简单使用的目的。
深拷贝:
深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束后,两个对象虽然存的值是相同的,但内存地址不一样,两个对象互不影响。
浅拷贝好比人和人的影子的关系,人消失影子消失。
深拷贝好比人和人的克隆人,人消失克隆人依然存在。
copy与retain的区别
copy是创建一个新对象,retain是创建一个指针,引用对象计数加一。copy属性标识两个对象内容相同,新的对象retain count为1,与旧对象引用计数无关,旧对象没有变化。copy减少对象上下文的依赖。
在非集合类对象中:对immutable对象进行copy操作,是指针复制,mutableCopy操作时内容复制;对mutable对象进行copy和mutableCopy都是内容复制。用代码简单表示如下:
-
[immutableObject copy] // 浅复制
-
[immutableObject mutableCopy] //深复制
-
[mutableObject copy] //深复制
-
[mutableObject mutableCopy] //深复制
比如以下代码:
1
2
|
NSMutableString *string = [NSMutableString stringWithString:@
"origin"
];
//copy
NSString *stringCopy = [string copy];
|
查看内存,会发现 string、stringCopy 内存地址都不一样,说明此时都是做内容拷贝、深拷贝。即使你进行如下操作:
1
|
[string appendString:@
"origion!"
]
|
stringCopy的值也不会因此改变,但是如果不使用copy,stringCopy的值就会被改变。 集合类对象以此类推。