网站建设快照优化,中国五码一级做爰网站,服装外贸网站建设,凡客帆布鞋一、为什么使用复制#xff1f;1.C语言以及Objective-C语言总是按值传递的#xff0c;按值传递意味着是隐式复制。在这里就分为两种情况#xff1a;(1)如果是非对象类型#xff0c;对传递过来的值进行更改#xff0c;只会更改副本#xff0c;对原始值没有影响#xff0c…一、为什么使用复制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协议就可以将一个对象以及包含的对象全部归档然后再以解档的方式重建对象从而获得深复制的对象。