oc的浅拷贝和深拷贝

来源:互联网 发布:程序员用外星人 编辑:程序博客网 时间:2024/04/25 22:17

浅拷贝

浅拷贝是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。如:

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的值就会被改变。 集合类对象以此类推。


0 0
原创粉丝点击