iOS中若是想复制一个对象可使用copy成员方法或者mutablecopy方法,这两个方法是NSObject类的成员方法。这两个方法在使用中是有所区别的。 函数
若是要复制一个NSArray对象,若是使用copy方法,则拷贝出一个NSArray对象,若是使用mutablecopy则复制出一 个NSMutableArray对象。copy老是拷贝出一个不可变的对象,而mutablecopy老是拷贝出可变的对象。 spa
若是是不可变对象调用copy方法,则拷贝出的对象也是不可变的,所以iOS规定:这种状况下的对象不进行复制,而是仅仅是多了一个指向这个对象的指针,对象的引用计数+1.这种状况叫作浅复制。 指针
其余的状况,例如可变复制为可变,可变复制为不可变,不可变复制为可变的状况都是将源对象复制一个副本,这个副本可变不可变由调用的方法决定。这种状况叫作深复制。 对象
全部的系统类对象均可以进行copy或者mutablecopy,并且不用去手动实现这两个方法。 但若是自定义类也要进行复制,这时候咱们就要对自定义的对象进行copy或者mutablecopy操做,而这个时候咱们就须要手动实现这两个方 法。 继承
让自定义类可以实现copy方法,须要让自定义的类实现<copying>协议,固然若是想使用mutablecopy方法则须要 实现<mutablecopying>协议。copying协议中只有一个函数,就是copyWithZone方法。须要在本身定义的类的实现文件中重写这个方法,自定义类为:Student,它含有一个name属性: 内存
- (id)copyWithZone:(NSZone *)zone { it
Student * stu = [ [ [ self class ] allocWithZone : zone ] init ] ; table
stu . name = self . name ; class
return stu ; 引用
}
allocWithZone:方法的调用者不是Student而是[self class]。
若是写具体的类名,即Student,则此处就会开辟Student对象的内存,而若是还有别的类继承这个类,例如又进一步延伸出一个类叫作GoodStudent类继承Student类,那么在复制GoodStudent的时候首先调用父类的方法,则父类方法建立了一个 Student,这时候子类比父类多出来的一些属性就不能使用了,由于建立的是一个父类而不是子类,父类不能识别子类独有的属性。改成self class则当子类调用这个方法的时候,self是子类自己,这时候建立出的对象是子类对象,就能够识别子类的属性了。