OC中对象的复制:一

本文深入探讨Objective-C中的对象复制,包括浅复制和深复制的概念及区别。通过实例代码展示了赋值操作、`copy`与`mutableCopy`方法的使用,解析了属性特性中`copy`关键字的作用。了解这些知识对于理解和管理OC对象的内存至关重要。
摘要由CSDN通过智能技术生成

看官们,我们在前面章回中介绍了OC中的属性特性,本章回中将介绍OC中对象的复制。

什么是复制


这里说的复制是copy的翻译,因为复制操作使用了copy这个方法。这里说的复制主要指对象的复制,不包括基本类型值的复制。在OC中我们经常会复制一个对象给另外一个对象,常见的复制是函数中的参数传递。

复制的分类


复制分为浅复制(shallow copy)和深(deep copy)复制。浅复制表示复制对象的引用,对象不会增加一个新的副本,但是它会导致对象的引用计数器加1.深复制表示复制一个新的对象副本,并且把对象内容复制到新对象中,确保二者的内容相同,它不会导致对象的引用计数器加1.接下来我们通过一个简单的代码来演示:
 

NSString *str1 = @"abc";  //str1指向了内容为“abc"的对象,对象的引用计数器为1
NSString *str2 = str1;    //str2也指向了内容为“abc"的对象,对象的其引用计数器加1
NSString *str3 = [str1 mutableCopy];  //str3指向了内容为“abc"的新对象,旧对象的引用计数器为不变



上面的示例代码中通过赋值操作实现了对象的复制操作,这里复制是浅复制;接着通过mutableCopy方法实现了深复制。注意深复制相当于创建了一个新的对象,新对象与旧对象的内容相同。

如何复制对象


常见的复制操作是使用赋值操作符,也就是等号。不过正式的复制操作是通过专门的方法实现的,专门的方法是`copy`和`mutableCopy`。这两个方法都是从NSObject类中继承来的,因此只要是OC提供的类都可以直接使用.比如我们在上面的示例代码中NSString类对象就直接使用了mutableCopy方法实现深复制操作。

属性特性中的复制


我们在上一章回中介绍属性特性时提到过copy,它是内存管理特性中的一个值。如果某个属性的内存管理特性被设置为copy,那么使用setter方法修改该属性时就会调用该属性所属类的copy方法。大家可能不好理解,因此我们举个例子来说明:


    @property (nonatomic,readwrite,copy) NSString *name;
    @property (nonatomic,readwrite,copy) Book* test



在例子中省略了类的声明,只有类中属性的定义,其中name属性的内存管理特性设置为copy,这时会调用name所属类的copy方法,也就是NSString类的copy方法,这是OC提供的类,不方便查看它的copy方法。我们可以自己定义一个类Book,然后在Book类中重写copy方法并且输出log信息,这样就可以查看了。我们会在示例代码中做演示。

 最后我们对本章回的内容做一个总结:

  • 1.复制主要包含浅复制和深复制;
  • 2.复制对象时使用`copy`和`mutableCopy`方法来实现;
  • 3.使用`copy`修饰类的属性时,修改该属性会调用属性所属类的`copy`方法;


看官们,本章回的内容就介绍到这里,欲知后事如何且听下回分解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值