OC中对象的复制:一

Posted talk_8

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OC中对象的复制:一相关的知识,希望对你有一定的参考价值。

看官们,我们在前面章回中介绍了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`方法;


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

以上是关于OC中对象的复制:一的主要内容,如果未能解决你的问题,请参考以下文章

OC中对象的复制:二

OC中对象的复制:二

OC Foundation框架 对象复制

译丨Yarn - Javascript 新一代套件管理

IOS开发-OC学习-常用功能代码片段整理

iOS深浅拷贝