《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方法

 

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

相关文章
相关标签/搜索