《Objective-c》Foundation框架 -(copy/mutableCopy)

 

1.copy(不可变副本)/mutableCopy(可变副本):

  • copy语法的目的:改变副本的时候,不会影响到源对象;

  • 一个对象可以使用copy/mutableCopy方法创建副本

  • copy需要先实现NSCopying协议,创建的是不可变副本

  • mutableCopy需要先实现NSMutableCopying协议,创建的时不可变副本

  • 深拷贝:内容(对象)的拷贝,源对象和副本指向的是不同的对象。源对象的引用计数器不变新对象的引用计数器设置为1

  • 浅拷贝:指针的拷贝,源对象和副本指向的时同一个对象。对象的引用计数器+1;相当于做了一次retain操作;

  • 只有不可变对象创建不可变副本(copy)才是前拷贝,其他的都是深拷贝;

  • NSString/NSMutableStringNSDictionary/NSMutableDictionaryNSArray/NSMutableArray等都已经实现了NSCopying协议NSMutableCopying协议,所以在使用copy或者mutableCopy创建副本是不用再实现NSCopying协议或者NSMutableCopying协议

2.浅拷贝(指针拷贝):

  • 浅拷贝:指针拷贝,不会产生新对象。源对象的计数器+1,相当于做了一次retain操作;

  • 只有一种情况是浅拷贝,不可变对象调用对象方法时;

  • 浅拷贝为指针的拷贝

3.深拷贝(内容拷贝):

  • 深拷贝:内容(对象)拷贝,会产生新对象。新对象的计数器置1,源对象的计数器不变;

  • 深拷贝一:NSString NSMutableCopy

  • 深拷贝二:NSMutableString  copy

         

  • 深拷贝三:NSMutableString  NSMutableCopy

          

3.自定义类以及子类的拷贝:

  • 自定义的类如果想使用copy或者mutableCopy必须要先实现NSCopying协议或者NSMutableCopying协议!不然会报错“[Student copyWithZone:]: unrecognized selector sent to instance 0x1030051a0

  • NSCopying协议或者NSMutableCopying协议中都各有一个方法:所以我们应该重新实现其方法!

            

  • - (id)copyWithZone:(NSZone *)zone方法的重写:

  • 由于子类中还有其他的属性(age),所以还要将age属性拷贝给副本,所以还要在子类中重写- (id)copyWithZone:(NSZone *)zone方法

 

  • 使用静态方法快速创建对象时的注意点:

 
 
 
 
 
 
 
posted @ 2015-03-27 00:30  深秋的露水  阅读(132)  评论(0编辑  收藏  举报