Objective-C复制解析

来源:互联网 发布:淘宝页面价格字体颜色 编辑:程序博客网 时间:2024/05/16 11:06
一、为什么使用复制?

1.C语言以及Objective-C语言总是按值传递的,按值传递意味着是隐式复制。在这里就分为两种情况:
   (1)如果是非对象类型,对传递过来的值进行更改,只会更改副本,对原始值没有影响,比如:int a = 3; int b; b = a, b = 4; 现在b的值是4,但是a的值仍然是3。
   (2)如果是对象类型,则就不一样了。Objective-C对象总是作为指针传递的,而且指针本身是隐式复制的,不会复制指针对应的对象,此时没有副本。当对传递过来的指针进行更改操作时,操作的还是原始对象。

2.假如说我们需要传递一个指针给一个对象,但是希望确保原始对象不会更改,这时候就用到了复制。复制操作将创建一个原始对象的副本,并且将副本的指针返回,这样两个指针将指向不同的对象,原始对象的值将不会再受影响。

二、NSCopying协议和NSMutableCopying协议

1.NSObject类的实例方法:copy和mutableCopy,对应对象类型的复制操作。但是如果一个对象要想支持copy方法,需要实现NSCopying协议并实现copyWithZone:方法,mutableCopy方法对应NSMutableCopying协议和mutableCopyWithZone:方法。

2.当对一个支持NSCopying协议的类调用copy方法时,NSObject默认会调用copyWithZone:方法,并将返回值返回给copy方法。假如对一个没有实现NSCopying协议的对象调用copy方法时,将会发生异常。NSMutableCopying协议同理。

3.copy方法,得到的是不可变的对象,不管之前是不是。
   mutableCopy方法,得到的是可变的对象,不管之前是不是。

4.在Property中,如果使用了readonly和copy,则在set和get方法中,复制的时候使用的是copy方法,即返回的对象是只读的,如果使用readwrite,使用的则是mutableCopy方法。

三、深复制与浅复制:

1.浅复制:仅仅复制所考虑的对象,而不复制它引用的对象;
   深复制:把复制的对象和对象所引用的对象都复制一遍,并且尽可能进行深层的复制。

2.支持复制的cocoa类全部实现了复制模式,并且返回一个浅复制的副本。

3.用于不可变的类的copyWithZone:方法的实现,根本不需要创建副本。它足以返回一个指向对象的原始指针,因为在返回对象之后没有更改它的风险。函数体实现内容很简单:return [self retain];

4.浅复制实现方法:在协议实现中,首先创建一个新对象,并且将原对象包含的值赋值给新的对象,然后返回新对象。创建新对象要使用allocWithZone:方法。

5.深复制的实现方法:获得cocoa对象的深复制的一种方便的方式是使用归档和解档模式。当一个对象以及所包含的所有对象都支持NSCoding协议,就可以将一个对象以及包含的对象全部归档,然后再以解档的方式重建对象,从而获得深复制的对象。
0 0