看官们,我们在前面章回中介绍了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`方法;
看官们,本章回的内容就介绍到这里,欲知后事如何且听下回分解!