oc的浅拷贝和深拷贝

浅拷贝

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值